Pythonアルゴリズム

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. 空入力、1要素、重複値を試す。
  2. 各ステップの状態を表示する。
  3. 別の解法と性能を比較する。
Python IDEで実行 →

チャレンジで練習する

このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。

すべてのチャレンジ