二分探索木(BST)における削除操作の解説


BSTにおけるノードの削除には以下のケースがあります:

  1. 削除対象のノードが葉ノード(子を持たないノード)である場合
  2. 削除対象のノードが1つの子を持つ場合
  3. 削除対象のノードが2つの子を持つ場合

まず、ケース1を見てみましょう。削除対象のノードが葉ノードの場合、そのノードを簡単に削除することができます。

次に、ケース2を考えます。削除対象のノードが1つの子を持つ場合、削除対象のノードをその子ノードで置き換えます。置き換えるノードは、削除対象のノードの左側の子ノードまたは右側の子ノードのいずれかです。

最後に、ケース3を見てみましょう。削除対象のノードが2つの子を持つ場合、削除するノードの次に大きい値(または次に小さい値)を持つノードを見つけます。このノードを削除対象のノードと置き換えます。このとき、置き換えたノードのサブツリーの要素は変わらず、整合性が保たれます。

これらのケースに基づいて、BSTにおける削除操作のコード例を示します(言語によって構文が異なる場合があります):

class Node:
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None
def delete_node(root, key):
    if root is None:
        return root
    if key < root.key:
        root.left = delete_node(root.left, key)
    elif key > root.key:
        root.right = delete_node(root.right, key)
    else:
        if root.left is None:
            temp = root.right
            root = None
            return temp
        elif root.right is None:
            temp = root.left
            root = None
            return temp
        temp = find_min(root.right)
        root.key = temp.key
        root.right = delete_node(root.right, temp.key)
    return root
def find_min(node):
    current = node
    while current.left is not None:
        current = current.left
    return current

このコード例では、delete_node関数を使用してノードを削除します。削除するノードが見つからない場合や、ノードが削除される場合は、適切な処理を行っています。

以上が、BSTにおける削除操作の解説とコード例です。これを参考にして、自分自身で実装してみてください。