バイナリ木の作成と操作:コード例を交えた詳細な解説


class TreeNode:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None
def insert_node(root, value):
    if root is None:
        return TreeNode(value)
    if value < root.value:
        root.left = insert_node(root.left, value)
    else:
        root.right = insert_node(root.right, value)
    return root
# 与えられた情報に基づいてバイナリ木を作成する
def create_binary_tree(data):
    root = None
    for value in data:
        root = insert_node(root, value)
    return root
data = [10, 5, 12, 4, 8, 20, 7, 15, 13]
root = create_binary_tree(data)
  1. バイナリ木の探索: バイナリ木から特定の値を探索する方法も重要です。以下は、バイナリ木を探索するためのコード例です。
def search_value(root, value):
    if root is None or root.value == value:
        return root
    if value < root.value:
        return search_value(root.left, value)
    return search_value(root.right, value)
value_to_search = 8
result = search_value(root, value_to_search)
if result:
    print("値", value_to_search, "は見つかりました")
else:
    print("値", value_to_search, "は見つかりませんでした")
  1. バイナリ木の削除: バイナリ木からノードを削除する方法も重要です。以下は、バイナリ木からノードを削除するためのコード例です。
def find_minimum_node(root):
    current = root
    while current.left is not None:
        current = current.left
    return current
def delete_node(root, value):
    if root is None:
        return root
    if value < root.value:
        root.left = delete_node(root.left, value)
    elif value > root.value:
        root.right = delete_node(root.right, value)
    else:
        if root.left is None:
            return root.right
        elif root.right is None:
            return root.left
        minimum_node = find_minimum_node(root.right)
        root.value = minimum_node.value
        root.right = delete_node(root.right, minimum_node.value)
    return root
value_to_delete = 12
root = delete_node(root, value_to_delete)
  1. バイナリ木の走査: バイナリ木の全ノードを訪れる方法として、深さ優先探索(preorder, inorder, postorder)と幅優先探索があります。以下は、それぞれの走査方法のコード例です。
# 深さ優先探索(preorder)
def preorder_traversal(root):
    if root:
        print(root.value)
        preorder_traversal(root.left)
        preorder_traversal(root.right)
# 深さ優先探索(inorder)
def inorder_traversal(root):
    if root:
        inorder_traversal(root.left)
        print(root.value)
        inorder_traversal(root.right)
# 深さ優先探索(postorder)
def postorder_traversal(root):
    if root:
        postorder_traversal(root.left)
        postorder_traversal(root.right)
        print(root.value)
# 幅優先探索
def breadth_first_traversal(root):
    if root is None:
        return
    queue = [root]
    while queue:
        node = queue.pop(0)
        print(node.value)
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)
print("深さ優先探索(preorder):")
preorder_traversal(root)
print("深さ優先探索(inorder):")
inorder_traversal(root)
print("深さ優先探索(postorder):")
postorder_traversal(root)
print("幅優先探索:")
breadth_first_traversal(root)

このブログ投稿では、バイナリ木の作成、探索、削除、および走査に関する詳細な解説と共に、それぞれの操作に関するコード例を提供しました。これにより、読者はバイナリ木を効果的に使用するための基礎的な知識を獲得できるでしょう。