Python 删除AVL树中的节点
我现在正在处理一个AVL树,除了删除一个节点的方法外,我几乎已经完成了。我现在有点困了,需要一些帮助。我这样做的方式是找到要删除的节点并递归地调用路径中每个节点上的平衡,以便在删除所需的节点后,一系列树平衡将在树上执行其工作。不幸的是,由于一些奇怪的原因,平衡不能正常工作-我打印了一些东西来测试发生了什么,出于某种原因,如果我们有一棵这样的树,例如:Python 删除AVL树中的节点,python,recursion,nodes,avl-tree,Python,Recursion,Nodes,Avl Tree,我现在正在处理一个AVL树,除了删除一个节点的方法外,我几乎已经完成了。我现在有点困了,需要一些帮助。我这样做的方式是找到要删除的节点并递归地调用路径中每个节点上的平衡,以便在删除所需的节点后,一系列树平衡将在树上执行其工作。不幸的是,由于一些奇怪的原因,平衡不能正常工作-我打印了一些东西来测试发生了什么,出于某种原因,如果我们有一棵这样的树,例如: 6 / \ 3 18 \ / \ 5 9 74 / \
6
/ \
3 18
\ / \
5 9 74
/ \
50 99
如果我想删除9,那么就会出现不平衡,
平衡将只平衡6的根节点,而不平衡18的节点
def deleteNode(self, val, root, previous):
if (val==root.value):
if (root.right is None and root.left is None):
if (previous is not None and (previous.value>root.value)):
previous.left=None
else:
if (previous is not None and (previous.value<root.value)):
previous.right=None
else:
if (previous is None):
self.root=None
return
if (root.right is None and root.left is not None):
if (previous is not None and (previous.value>root.value)):
previous.left=root.left
else:
if (previous is not None and (previous.value<root.value)):
previous.right=root.left
else:
if (previous is None):
self.root=root.left
return
if (root.left is None and root.right is not None):
if (previous is not None and (previous.value>root.value)):
previous.left=root.right
else:
if (previous is not None and (previous.value<root.value)):
previous.right=root.right
else:
if (previous is None):
self.root=root.right
return
if (root.left is not None and root.right is not None):
rval=self.maxValue(root.left).value
self.deleteNode(self.maxValue(root.left).value , self.root, None)
root.value=rval
return
else:
if (root.value<val):
self.deleteNode(val, root.right, root)
if (root.right is not None):
print root.value,
print root.right.value
self.balance(root.right, root)
else:
if (root.value>val):
self.deleteNode(val, root.left, root)
if (root.left is not None):
print root.value,
print root.left.value
self.balance(root.left, root)
def deleteNode(self、val、root、previous):
如果(val==root.value):
如果(root.right为无,root.left为无):
如果(previous不是None并且(previous.value>root.value)):
上一个。左=无
其他:
如果(previous不是None和(previous.valueroot.value)):
previous.left=root.left
其他:
如果(previous不是None和(previous.valueroot.value)):
previous.left=root.right
其他:
如果(previous)不是None,并且(previous.valueI)我怀疑问题的根本原因(请原谅双关语)是您的balance
函数中的某个地方,您还没有向我们展示该函数。您可能希望向我们展示您的deleteNode
函数,而不是deleteNode
。(将deleteNode
放在要点中,这样问题就不会太长)。@Skorpius如果你能在回答这个问题时详细说明你的解决方案,对未来的访问者会很有帮助。