我正在实现一种迭代解决方案,该方法在给定树根和要删除节点的键的情况下,在BST中删除节点。
我有两个辅助函数,它们返回BST中节点的后继者和前任者。
def successor(root):
root = root.right
while root.left:
root = root.left
return root
和
def predecessor(root):
root = root.left
while root.right:
root = root.right
return root
在我的主要功能中,我首先搜索目标节点,然后搜索要替换目标节点的节点,更改值,然后删除(将其设置为None)后继/前任节点。
def deleteNode(self, root: TreeNode, key: int) -> TreeNode:
if not root:
return None
dummy = TreeNode(-1)
dummy.left = root
while root:
if root.val < key:
root = root.right
elif root.val > key:
root = root.left
elif root.val == key:
break
if not root.left and not root.right:
root = None
elif root.right:
succ = successor(root)
root.val = succ.val
root = root.right
while root.left:
root = root.left
root = None
elif root.left:
pred = predecessor(root)
root.val = succ.val
pred = None
root = root.left
while root.right:
root = root.right
root = None
return dummy.left
但是,由于某些原因,即使我转到该节点并将其设置为None
,前任/后继节点也不会被删除。我在这里想念东西吗?
谢谢