我尝试在BST中实现删除节点。 这是我的部分代码。
def delete(node,key):
#Locate that node with value k
cNode=node
target=None
while cNode:
if cNode.value==key:
target=cNode
break
elif node.value>key:
cNode=cNode.lChild
elif node.value<key:
cNode=cNode.rChild
target=None
return node
当我尝试使用上述方法删除叶节点时。我失败了。当方法返回时,它对原始BST没有任何作用。那么这段代码的问题是什么?我假设它应该有关于python如何通过引用传递参数的东西?但我现在很困惑。 提前谢谢了。
答案 0 :(得分:7)
target = None
仅将变量target
重新绑定为新值None
。无论target
以前绑定的是什么都不会改变。
您必须跟踪父节点,并将其lChild
或rChild
属性设置为None
。
def delete(node,key):
cNode = node
target = parent = None
while cNode:
if cNode.value == key:
target = cNode
break
elif cNode.value > key:
parent, cNode = cNode, cNode.lChild
elif cNode.value < key:
parent, cNode = cNode, cNode.rChild
if target:
if parent:
if parent.lChild is target:
parent.lChild = None
else:
parent.rChild = None
else:
# target is top-level node; perhaps return None in that case?
return node