Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

木(ツリー)

木(Tree) は、ノード(節)とエッジ(辺)で構成される階層的なデータ構造。

  • 根(root): 最上位のノード

  • 子(child): あるノードの直下のノード

  • 親(parent): あるノードの直上のノード

  • 葉(leaf): 子を持たないノード

  • 深さ(depth): 根からのエッジ数

  • 高さ(height): 根から最も遠い葉までのエッジ数

木は再帰的な構造を持つため、再帰的なアルゴリズムと相性がよい。

二分木(Binary Tree)

各ノードが最大2つの子(左・右)を持つ木。

木の走査(Tree Traversal)

木の全ノードを訪問する順序には以下の種類がある。

走査順訪問順序用途
前順(preorder)根 → 左 → 右ツリーのコピー・シリアライズ
中順(inorder)左 → 根 → 右BST のソート済み列挙
後順(postorder)左 → 右 → 根ツリーの削除・サイズ計算
幅優先(BFS)深さ順に左から右最短経路・レベル順処理

二分探索木(Binary Search Tree, BST)

二分探索木 は、次の条件を満たす二分木:

  • 左部分木の全ノードの値 < 根の値

  • 右部分木の全ノードの値 > 根の値

この性質により、木が平衡であれば探索・挿入・削除が O(log⁡n)O(\log n) で行える。

操作:

  • insert(x): 値 x を挿入する(O(log⁡n)O(\log n))

  • search(x): 値 x を検索する(O(log⁡n)O(\log n))

  • delete(x): 値 x を削除する(O(log⁡n)O(\log n))

計算量まとめ

操作平均(平衡時)最悪(偏った木)
探索O(log⁡n)O(\log n)O(n)O(n)
挿入O(log⁡n)O(\log n)O(n)O(n)
削除O(log⁡n)O(\log n)O(n)O(n)
走査(全ノード)O(n)O(n)O(n)O(n)

昇順・降順に要素を挿入すると木が一方向に伸びて O(n)O(n) に劣化する。これを防ぐために 平衡二分木(AVL木・赤黒木) が使われる。

Pythonでの活用

Python の標準ライブラリには BST の実装はないが、sortedcontainers の SortedList が O(log⁡n)O(\log n) の挿入・削除・探索を提供する。

競技プログラミングでは sortedcontainers が利用可能な環境では SortedList を使うことが多い。

木の高さ・サイズ

再帰を使うと木のプロパティを簡潔に計算できる。