Python 3は二叉検索ツリーのノードの削除を実現
に質問
ツリーのルートノードrootと値keyを指定し、ツリー内のkeyに対応するノードを削除し、ツリーの性質が変わらないことを保証します.ツリー(更新される可能性がある)のルートノードの参照を返します.
一般に、ノードを削除するには、次の2つのステップに分けられます.
まず削除するノードを見つけます.見つかったら削除します.説明:アルゴリズムの時間複雑度はO(h),hはツリーの高さであることが要求される.
例:
解析ターゲットノードにサブノードがない場合、ターゲットノードを直接削除できます. ターゲット・セクションにサブノードが1つしかない場合は、そのサブノードを置き換えることができます. ターゲットノードに2つのサブノードがある場合、ターゲットノードを削除するには、後続ノードまたは前駆ノードの順序で置き換える必要があります.
コード:
ツリーの定義:
ノードの削除方法:
ツリーのルートノードrootと値keyを指定し、ツリー内のkeyに対応するノードを削除し、ツリーの性質が変わらないことを保証します.ツリー(更新される可能性がある)のルートノードの参照を返します.
一般に、ノードを削除するには、次の2つのステップに分けられます.
まず削除するノードを見つけます.見つかったら削除します.説明:アルゴリズムの時間複雑度はO(h),hはツリーの高さであることが要求される.
例:
root = [5,3,6,2,4,null,7]
key = 3
5
/ \
3 6
/ \ \
2 4 7
3, 3 , 。
[5,4,6,2,null,null,7], 。
5
/ \
4 6
/ \
2 7
[5,2,6,null,4,null,7]。
5
/ \
2 6
\ \
4 7
解析
コード:
ツリーの定義:
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
ノードの削除方法:
def deleteNode(self, root: TreeNode, key: int) -> TreeNode:
if root is None:
return None
if root.val == key:
if root.left is None:
if root.right is None: # ,
return None
else:
root = root.right # ,
elif root.right is None:
root = root.left # ,
else:
buffer = None #buffer
tmp = root.right
while tmp.left is not None:
buffer = tmp
tmp = tmp.left
root.val, tmp.val = tmp.val, root.val
if buffer is None: #buffer , root
root.right = self.deleteNode(tmp, key)
else:
buffer.left = self.deleteNode(tmp, key)
elif key < root.val:
root.left = self.deleteNode(root.left, key)
else:
root.right = self.deleteNode(root.right, key)
return root