BSTにおいて、ノードの削除は以下の手順で行われます。
-
削除するノードの探索: 削除したいノードを探索します。削除したいノードが見つからない場合は、削除操作は行われません。
-
削除するノードの削除先の選択: 削除するノードが葉ノード(子を持たないノード)である場合、そのノードを直接削除します。削除するノードが子を1つだけ持つ場合は、その子ノードを削除するノードの位置に置き換えます。削除するノードが子を2つ持つ場合は、削除するノードの次に大きい値を持つノード(右部分木の最小値)または次に小さい値を持つノード(左部分木の最大値)を削除先として選択します。
-
ノードの削除: 選択したノードを削除します。この時、選択したノードを置き換えるために、そのノードの子ノードや親ノードとの接続を適切に修正する必要があります。
ノードの削除に関するコード例をいくつか示します。
【Pythonコード例】
class Node:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
def delete_node(root, key):
if root is None:
return root
if key < root.value:
root.left = delete_node(root.left, key)
elif key > root.value:
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 = get_min_value(root.right)
root.value = temp.value
root.right = delete_node(root.right, temp.value)
return root
def get_min_value(node):
current = node
while current.left is not None:
current = current.left
return current
# 削除操作の実行例
root = Node(5)
root.left = Node(3)
root.right = Node(7)
root.left.left = Node(2)
root.left.right = Node(4)
root.right.left = Node(6)
root.right.right = Node(8)
root = delete_node(root, 5)
# 削除後のBSTの表示
# 2 3 4 6 7 8
inorder_traversal(root)
このように、BSTにおけるノードの削除は、探索と適切なノードの置換によって行われます。以上の手順とコード例を参考にして、自分自身でもBSTにおけるノードの削除を実装してみてください。