Pythonで学ぶ二分探索木
二分探索木は小さい値を左の部分木に、大きい値を右の部分木に置きます。そのため、比較のたびに残りの木の半分を候補から外せます。
Pythonで学ぶ二分探索木とは?
二分探索木は小さい値を左の部分木に、大きい値を右の部分木に置きます。そのため、比較のたびに残りの木の半分を候補から外せます。
Pythonで二分探索木を作り、値の挿入、検索、昇順での一覧表示を行います。
どのような場面で使う?
- アルゴリズムとデータ構造を理解する。
- 各ステップと境界ケースを確認する。
- 実行時間とメモリ使用量を比較する。
動きで理解する
値を挿入して配置される場所を確認し、値を検索して経路をたどり、走査を実行して訪問順を見ましょう。
サンプルコード
main.py
class Node:
def __init__(self, value):
self.value = value
self.left = None # smaller values go left
self.right = None # larger values go right
def insert(node, value):
if node is None:
return Node(value)
if value < node.value:
node.left = insert(node.left, value)
elif value > node.value:
node.right = insert(node.right, value)
return node
def contains(node, value):
# Each comparison discards one whole subtree.
while node is not None:
if value == node.value:
return True
node = node.left if value < node.value else node.right
return False
def inorder(node):
# Left subtree, node, right subtree: visits values in sorted order.
if node is None:
return []
return inorder(node.left) + [node.value] + inorder(node.right)
def height(node):
if node is None:
return 0
return 1 + max(height(node.left), height(node.right))
root = None
for value in [50, 30, 70, 20, 40, 60, 80]:
root = insert(root, value)
print("inorder:", inorder(root))
print("contains 60:", contains(root, 60))
print("contains 65:", contains(root, 65))
print("height:", height(root))
期待される出力
inorder: [20, 30, 40, 50, 60, 70, 80]
contains 60: True
contains 65: False
height: 3
仕組み
insert()は根から下へたどり、値を正しい位置につなぎます。contains()は1本の経路だけをたどるので、バランスの取れた木ではO(log n)ステップで済みます。inorder走査は左、ノード、右の順に訪れるため、値がソートされた順に出てきます。
値を変更し、PythonをインストールせずにCodeUtilityオンラインPythonコンパイラで実行できます。
練習問題
入力値と境界ケースを変更し、より大きなデータでも動作を確認してください。
- 空入力、1要素、重複値を試す。
- 各ステップの状態を表示する。
- 別の解法と性能を比較する。
チャレンジで練習する
このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。
- Tree Diameter A tree is a connected undirected graph with no cycles. 中級
- コンポジットでフォルダーサイズ フォルダがファイルや他のフォルダを含む木構造で、すべてのフォルダの合計サイズを計算します。 中級