从BST删除而不删除节点

时间:2018-11-11 18:55:49

标签: python binary-search-tree

这是有关从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')

0 个答案:

没有答案