【问题标题】:Forced to return into while loop强制返回while循环
【发布时间】: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


【解决方案1】:

我认为问题在于您的递归。让我们假设一个非常简单的结构。没有左或右的节点(均为空)。

首先,leafnode 一开始就为空。鉴于结构,我们不能进入 if 块。鉴于 flag==false,我们不能进入 while 循环。所以你回来时会得到一个 NPE。

如果我们把它弄得更复杂一点,一个节点有左右,但没有孙子,我们会遇到同样的问题。

你会碰到第一个 if 块。您使用 flag == true 进行递归,但将递归结果向左抛出。在第一次递归调用中,您不能进入第一个 if 块。您将进入 while 循环,然后进入 else 块。叶节点被设置为一个节点。您将返回到第一次调用(这是在 if 块中)。此时,leafnode 仍为空。繁荣,NPE。

如何初始化叶节点取决于您。您可能应该将其设置为 rlmost 的递归调用。

【讨论】:

  • 啊,我明白你的意思了。我已将leafnode 设置为他们正在查找的那个,并消除了while 循环。现在我在其他地方遇到错误,与递归无关。谢谢!
猜你喜欢
  • 2015-11-17
  • 2016-05-29
  • 2016-11-30
  • 2019-05-08
  • 2017-11-09
  • 2014-03-25
  • 2021-02-01
  • 2012-06-26
相关资源
最近更新 更多