BSTにおけるノードの削除には以下のケースがあります:
- 削除対象のノードが葉ノード(子を持たないノード)である場合
- 削除対象のノードが1つの子を持つ場合
- 削除対象のノードが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における削除操作の解説とコード例です。これを参考にして、自分自身で実装してみてください。