这是有关从BST删除节点的面试准备问题。
当我尝试在第31行上设置node = node.right时,某些事情没有按预期方式工作。我发现这没有按预期方式工作,因此我不得不手动设置node.value,node.right,node。左移至node.right。* ...确实有效。但是,现在我需要删除一个叶子(第36行),我已经尝试设置node = None出于相同的原因而没有用。我也尝试了del节点也无法正常工作。
为什么它不能按预期工作?我已经通过调试器跟踪了代码,node变量与主树具有相同的内存地址。是某种范围问题吗?我不明白谢谢你的帮助。
下面以小示例复制完整代码:
class Tree(object):
def __init__(self, x):
self.value = x
self.left = None
self.right = None
def deleteFromBST(t, queries):
def find(t, q):
if not t:
return None
if t.value == q:
return t
if t.value > q:
return find(t.left, q)
else:
return find(t.right, q)
def delete(t, q):
n = find(t, q)
if n:
if n.left:
rp = n
r = n.left
while r.right:
rp = r
r = r.right
n.value = r.value
rp.right = None
elif n.right:
# n = n.right
n.value=n.right.value
n.left=n.right.left
n.right=n.right.right
else:
# n = None
del n
for q in queries:
delete(t, q)
return t
tree_dic={
"value": 5,
"left": {
"value": 2,
"left": {
"value": 1,
"left": None,
"right": None
},
"right": {
"value": 3,
"left": None,
"right": None
}
},
"right": {
"value": 6,
"left": None,
"right": {
"value": 8,
"left": {
"value": 7,
"left": None,
"right": None
},
"right": None
}
}
}
queries=[4, 5, 6,7]
# t=Tree(tt['value'])
def build_tree(d):
r=Tree(d['value'])
if d['left']:
r.left=build_tree(d['left'])
if d['right']:
r.right=build_tree(d['right'])
return r
t=build_tree(tree_dic)
o=deleteFromBST(t,queries)
print('hi')