二分探索木(Binary Search Tree)におけるノードの削除方法


ノードの削除手順は以下の通りです:

  1. 削除するノードを見つけます。削除するノードが存在しない場合は処理を終了します。
  2. 削除するノードが子を持たない場合(葉ノード)は、そのノードを直接削除します。
  3. 削除するノードが1つの子を持つ場合は、その子ノードを削除するノードの位置に置き換えます。
  4. 削除するノードが2つの子を持つ場合は、以下の手順を実行します:
    • 削除するノードの中で、左部分木の最大値または右部分木の最小値を持つノードを探します。これを、削除するノードの「前身ノード」と呼びます。
    • 削除するノードの前身ノードを削除するノードの位置に配置します。
    • 削除するノードの前身ノードは、左部分木の最大値の場合は左部分木から、右部分木の最小値の場合は右部分木から削除します。

これらの手順に従ってノードを削除すると、二分探索木の性質が保たれます。

以下に、ノードの削除を示す簡単なPythonコード例を示します:

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None
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
        else:
            successor = find_min_node(root.right)
            root.value = successor.value
            root.right = delete_node(root.right, successor.value)
    return root
def find_min_node(node):
    current = node
    while current.left is not None:
        current = current.left
    return current

このコードは、指定された値を持つノードを削除するdelete_node関数を実装しています。find_min_node関数は、指定されたノード以下の部分木の最小値のノードを見つけるために使用されます。

以上が、二分探索木におけるノードの削除方法の概要です。これを参考にして、ブログ投稿を作成してください。