バイナリサーチツリーにおける要素の削除は以下の手順で行います:
-
削除対象の要素を見つけるために、ツリーを走査します。通常は、削除対象の要素が見つかるまで再帰的に左右のサブツリーを探索します。
-
削除対象の要素が見つかった場合、以下の3つのケースに分けて処理します:
- 削除対象のノードが葉ノードである場合: そのノードを単純に削除します。
- 削除対象のノードが子を1つだけ持つ場合: 削除対象のノードをその子ノードと入れ替え、削除するノードの子ノードを正しくリンクします。
- 削除対象のノードが2つの子を持つ場合: 一般的な方法として、削除対象のノードの直前または直後の値を持つノードを見つけ、その値と入れ替えます。そして、入れ替えたノードを再帰的に削除します。
-
削除操作後、ツリーがバランスを失っている場合は、ツリーを再構築する必要があります。バランスの方法にはいくつかのアルゴリズムがありますが、代表的なものにAVL木や赤黒木などがあります。
以下に、上記の手順を反映した簡単なコード例を示します。この例では、整数値を要素とするバイナリサーチツリーを操作しています。
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_successor(root.right)
root.value = successor.value
root.right = delete_node(root.right, successor.value)
return root
def find_successor(node):
current = node
while current.left is not None:
current = current.left
return current
# バイナリサーチツリーの使用例
root = Node(50)
root.left = Node(30)
root.right = Node(70)
root.left.left = Node(20)
root.left.right = Node(40)
root.right.left = Node(60)
root.right.right = Node(80)
print("削除前のツリー:")
# ツリーの表示コードを追加
root = delete_node(root, 30)
print("削除後のツリー:")
# ツリーの表示コードを追加
上記のコードは、バイナリサーチツリーから要素を削除する基本的な手順を示しています。ただし、ツリーの再構築やバランスの調整は行っていません。ツリーのバランスを保つためには、別のアルゴリズムを使用する必要があります。
このコード例は、削除前と削除後のツリーの表示を行う部分がコメントアウトされています。適切なツリーの表示コードを追加することで、削除操作の結果を確認することができます。
以上が、バイナリサーチツリーの削除操作の解説とコード例です。