如何通过引用传递python?

时间:2014-01-15 19:57:24

标签: python pass-by-reference

我尝试在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如何通过引用传递参数的东西?但我现在很困惑。 提前谢谢了。

1 个答案:

答案 0 :(得分:7)

target = None将变量target重新绑定为新值None。无论target以前绑定的是什么都不会改变。

您必须跟踪父节点,并将其lChildrChild属性设置为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