从BST删除不删除节点

2024-04-29 08:09:45 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个关于从BST删除节点的面试准备问题

当我在第31行尝试设置node=node.right时,出现了一些不符合预期的情况。我发现这不符合预期,所以我必须手动将node.value、node.right、node.left设置为node.right.*…这确实有效。然而,现在我要删除一个叶子(第36行),我试过设置node=None,但由于同样的原因,没有成功。我也试过del node,但也不起作用

为什么这不能像预期的那样工作?我已经通过调试器跟踪了代码,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')

Tags: buildselfrightnonenodetreereturnif