我在许多网站上找到了代码,从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;
}
}
}
答案 0 :(得分:1)
<强>原因强>
由于它的递归。对于每次递归调用,pos都是不同的。所以一旦找到节点,它将检查它是否有左或右子。根据你共享的代码,当节点没有离开时右子,它将被设置为null,这是正确的。
简而言之,如果要删除的节点是叶节点,则将其设置为空。
注意:您的代码中还需要进行一些更改。首先,我会说您需要最后返回pos,并且必须在递归调用delete方法时分配它。
pos.leftChild=remove (maxFromLeft.key, pos.leftChild);
答案 1 :(得分:1)
你是对的。 pos不会设置为null。它只是在当前堆栈帧中更改局部变量do {
console.log ("do once");
} while (i<8)
的值,但只要从该递归级别返回,就不会保留更改。