【发布时间】:2015-02-16 16:36:39
【问题描述】:
我正在写一个二叉树。在尝试删除具有两个子节点的节点时,我编写了一个搜索右子节点分支的最左侧节点的方法。
我收到一个奇怪的错误 - 在返回值之前,尽管条件不满足(标志为假),我似乎再次进入 while 循环。在 while 循环之后,它递归地调用自己并以一个空节点结束,因为它在树中走得太远了。
有人能说出为什么会这样吗?
protected Key rlmost (BSTreeNode node){
BSTreeNode leafnode = null;
if ((node.right!=null)&&(node.left!=null)&&(flag==false)){
flag = true; // set flag to true
System.out.println("left node" + node.left.kvPair.key);
rlmost(node.left);
System.out.println();
}
while (flag==true){
if (node.right != null){
System.out.println("right node" + node.right.kvPair.key);
rlmost(node.right);
}
else {
leafnode = node;
System.out.println("rlmost node" + leafnode.kvPair.key);
flag = false;
}
}
return leafnode.kvPair.key;
}
【问题讨论】:
-
一开始初始化的flag是什么?
-
初始化为false
-
您是否在使用 leafnode.kvPair.key 的 return 语句中出现空指针错误?
-
是的,我是.. 尽管那里没有节点,但它似乎更深入到树中。我不知道为什么,因为标志已经是假的。
-
顺便说一句,您可以说 while(flag) 和 while(!flag) 而不是使用 flag == true 和 flag == false。此外,您不应在递归函数中使用 while 循环。如果需要,将 while 循环放在调用递归函数的函数中 - 它会让事情变得不那么复杂。
标签: java while-loop binary-tree