如何从二叉搜索树中删除?

时间:2015-10-11 12:27:18

标签: java binary-search-tree

我在许多网站上找到了代码,从java的二进制搜索树中删除了一个节点。我对此代码的问题在于,当找到要删除的元素时,在其中一种情况下,尝试将pos值归零。现在我们以递归方式调用此方法,我认为实际的pos不会设置为null。如果我说得对,请告诉我

public void remove (String key, BSTNode pos)
{
    if (pos == null) return;
    if (key.compareTo(pos.key)<0)
        remove (key, pos.leftChild);
    else if (key.compareTo(pos.key)>0)
        remove (key, pos.rightChild);
    else {
        if (pos.leftChild != null && pos.rightChild != null)
        {
            /* pos has two children */
            BSTNode maxFromLeft = findMax (pos.leftChild); //need to make a findMax helper 
            //"Replacing "  pos.key " with " maxFromLeft.key
            pos.key = maxFromLeft.key;
            remove (maxFromLeft.key, pos.leftChild);
        }
        else if(pos.leftChild != null) {
            /* node pointed by pos has at most one child */
            BSTNode trash = pos;
            //"Promoting " pos.leftChild.key " to replace " pos.key
            pos = pos.leftChild;
            trash = null;
        }
        else if(pos.rightChild != null) {
            /* node pointed by pos has at most one child */
            BSTNode trash = pos;
            /* "Promoting " pos.rightChild.key" to replace " pos.key */
            pos = pos.rightChild;
            trash = null;
        }
        else {
            pos = null;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

是的,你是对的。实际的pos不会被设置为null。

<强>原因

由于它的递归。对于每次递归调用,pos都是不同的。所以一旦找到节点,它将检查它是否有左或右子。根据你共享的代码,当节点没有离开时右子,它将被设置为null,这是正确的。

简而言之,如果要删除的节点是叶节点,则将其设置为空。

注意:您的代码中还需要进行一些更改。首先,我会说您需要最后返回pos,并且必须在递归调用delete方法时分配它。

pos.leftChild=remove (maxFromLeft.key, pos.leftChild);

答案 1 :(得分:1)

你是对的。 pos不会设置为null。它只是在当前堆栈帧中更改局部变量do { console.log ("do once"); } while (i<8) 的值,但只要从该递归级别返回,就不会保留更改。