二分木の削除操作は、指定された値を持つノードを木から削除する操作です。この操作にはいくつかのケースがあります。以下では、それぞれのケースについて説明します。
-
削除するノードが葉ノードの場合: 葉ノードは子を持たないノードです。削除するノードが葉ノードの場合、そのノードを単純に削除します。
-
削除するノードが子を1つだけ持つ場合: 削除するノードが子を1つだけ持つ場合、その子ノードを削除するノードの位置に移動させます。
-
削除するノードが子を2つ持つ場合: この場合、削除するノードの右部分木の最小値(または左部分木の最大値)を見つけ、その値で削除するノードを置き換えます。そして、右部分木(または左部分木)からその最小値(または最大値)を削除します。
これらのケースに基づいて、二分木の削除操作を実装する方法をいくつか紹介します。以下に例を示します。
- 再帰的な実装:
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:
min_value = find_min(root.right)
root.value = min_value
root.right = delete_node(root.right, min_value)
return root
- 非再帰的な実装(スタックを使用):
def delete_node(root, value):
if root is None:
return root
stack = [root]
while stack:
current = stack.pop()
if value < current.value:
if current.left:
if current.left.value == value:
current.left = None
else:
stack.append(current.left)
elif value > current.value:
if current.right:
if current.right.value == value:
current.right = None
else:
stack.append(current.right)
else:
if current.left is None:
return current.right
elif current.right is None:
return current.left
else:
min_value = find_min(current.right)
current.value = min_value
current.right = None
stack.append(current.right)
return root
これらは二分木の削除操作を実装するための一般的な方法の一部です。実際の実装には、使用するプログラミング言語やデータ構造によって適切な方法を選択する必要があります。必要に応じてこれらの例を参考にしてください。