【问题标题】:Return in case of Recursive call to a method在递归调用方法的情况下返回
【发布时间】:2020-01-03 08:36:35
【问题描述】:

我有一段代码需要深入了解,我不想知道问题的正确解决方案。我只想知道为什么我的概念失败了。 所以功能是检查二叉树是否是BST。如果是,我需要返回 1,否则返回 0。我的代码如下

int isBST(Node root) {
 if(root == null)
  return 1;
 if(root.left!=null) {
  if(root.left.data<root.data)
    isBST(root.left);
  else
   return 0; // line:a
 }
 if(root.right!=null) {
  if(root.right.data<root.data)
    isBST(root.right);
  else
   return 0;
 }
return 1;
}

对于这件作品,当我有一棵二叉树时如下:

5
 \
  7
 /
8

我希望它达到 8 值并在 line:a 处中断,但它返回 1 而不是 0。现在我知道 0 会返回给父调用方法。但它不会因为我在没有捕获返回值的情况下进行 isBST 调用而终止吗? 如有其他BUG请不要指出。

【问题讨论】:

    标签: java recursion data-structures binary-search-tree


    【解决方案1】:

    我看到以下问题:

    • 如果(且仅当)isBST(root.left)isBST(root.right) 为 false,您需要立即返回 0(顺便说一句,您为什么不使用布尔值?)。
    • 条件root.right.data&lt;root.data 应反转:root.right.data&gt;=root.data

    所以这里是修改后的代码(保持int返回类型):

    int isBST(Node root) {
     if(root == null)
      return 1;
     if(root.left!=null) {
      if(root.left.data<root.data) {
        if (isBST(root.left) == 0)
          return 0;
      } else
       return 0;
     }
     if(root.right!=null) {
      if(root.right.data>=root.data) {
        if (isBST(root.right) == 0) {
          return 0;
        }
      } else
       return 0;
     }
    return 1;
    }
    

    【讨论】:

      【解决方案2】:

      对于一般情况,您的方法行不通。判断一棵树是否为 BST 的方法是递归地检查当前节点是否大于左子树的最大元素,并且小于右子树的最小元素。此外,您还缺少递归调用中的返回值:

      return isBST(root.left);
      ...
      return isBST(root.right);
      

      顺便问一下,你为什么要为此返回01?请改用falsetrue,将返回类型更改为boolean

      【讨论】:

      • 谢谢。只需要那个确认,我想现在需要找到如何打破递归调用。另外,我没有使用布尔值,因为它是来自编码平台的问题,需要整数格式的答案。
      • 另请参阅我的第一段,恐怕您必须重写您的方法,以目前的形式它不会起作用。
      • 如果我递归查找根不在左右子节点之间的情况,并在任何子树中发生这种情况时立即返回 0,如果从未发生则返回 1,为什么会一般情况下会失败吗?这段代码可能行不通,但理论也行不通??
      • 很容易构建一棵会让你的代码失败的树,并说明为什么我的方法是正确的(提示:不要考虑立即左右的孩子,再深入一点)。花点时间思考一下,我不想破坏发现的乐趣;)
      • @SonaliGupta 太棒了,我知道你会想出来的!
      【解决方案3】:

      您应该检查正确的数据是否大于当前数据并返回递归调用的值

      if(root.right.data>root.data)
      

      【讨论】:

      • 正如我所提到的,请不要指出与问题无关的内容。
      • @SonaliGupta 不相关?您确定吗?检查节点 5 时,它将测试 7 &lt; 5 并且因为 false,返回零 - 最好不要发布错误代码...
      • 是的,因为我的问题是关于递归函数没有为左孩子返回 0(试图找出递归函数是如何工作的)。更少或更大只是一个错字/bst 逻辑。
      • @SonaliGupta 大多数情况下,我们期望minimal reproducible example.. 可重现性在这个概念中很重要..(缺少的返回也可能只是一个错字)和“我希望它达到 8 值”这不会发生
      猜你喜欢
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 2016-08-03
      • 2022-01-16
      相关资源
      最近更新 更多