【问题标题】:Java recursive binary treeJava递归二叉树
【发布时间】:2010-12-07 11:25:12
【问题描述】:

欢迎! 我有一个名为 less 的递归公共静态方法,它接受一个树节点(原始二叉树,而不是真正的搜索树)和一个 int 参数,如果树中的所有值都小于整数,则返回该参数。所以,我会使用public class TN { public int value; public TN left, right; public TN(int v, TN l, TN r) {value = v; left = l; right = r;} } 所以,我的方法应该是这样的:

public static boolean less(TN s, int toFind){
if (s == null)
   return true;
else{ 
 if(s.value <= toFind)  
   return less(s.left, toFind) && less(s.right, toFind);  // right here do I return true? or do I have to somehow recall recursively
 else  
   return false; 
}

我想知道这是对的还是我遗漏了什么???是不是一定要返回真假??

【问题讨论】:

    标签: java recursion binary-tree


    【解决方案1】:

    请注意,您的函数不可能返回 true,因为每次终止递归时,您都会返回 false?问题出在您的第一次检查中。你说“树中的所有值都小于整数”。好吧,在一棵空树中,所有值(其中没有)确实小于任何整数,所以在这种情况下你应该返回true

    此外,当您说“小于”时,您是在比较相等性,因此您实际上是在检查所有值是否都等于整数,而不是小于它。

    【讨论】:

      【解决方案2】:
      return less(s, toFind); 
      

      应该是:

      return less(s.left, toFind) && less(s.right, toFind);
      

      我不知道为什么函数是静态的。

      如前所述,您的第一部分应该是:

      if (s == null) return true;
      

      (编辑:当所有节点都满足条件时,这会让你得到一个真实的结果。你有一个==,应该是一个

      您需要遍历您的树,因此您需要在您的子节点上调用您的函数。接下来,您需要返回 true 作为默认结果。这样,当你达到一个大于你正在寻找的数字时,你可以立即返回 false 而无需遍历任何孩子。我希望我已经在逻辑上为您提供了足够的帮助,以便您自己完成其余部分。

      【讨论】:

      • 那么,对于 else 语句,我可以只返回调用方法而不是返回 false 对吗?
      • 嗯,你需要有一个相对全局的变量,在分支之前检查它。例如。 “if (found == true) return false;”,然后将else改为“else { found = true; return false }”。这样,如果找到的数字大于您要查找的数字,它将设置 found 为 true。然后每个其他分支也将返回。您只需要确保在每次调用函数时都能看到相同的“找到”。
      【解决方案3】:

      有很多更优雅的面向对象的方式来编写这个。我的建议是使less() 成为TN 类的非静态成员函数。这样,如果树的根节点称为root,您只需调用root.less()。每次调用less() 都会调用left.less()right.less()

      由于您发布了甚至无法编译的示例代码,我想知道您是否正在使用 IDE,或者甚至尝试使用 javac 编译您的类。如果您是 Java 新手,我强烈建议您使用 Eclipse、Netbeans 或其他 IDE。

      【讨论】:

        【解决方案4】:

        首先,if (s = null) 应该是 if (s == null),因为您正在进行比较,而不是将 s 的值设置为 null

        return less(null, toFind); 语句不断调用你的方法 - 你会溢出你的堆栈。

        【讨论】:

        • 另外,if (s = null) 不会编译。
        • 马特,在发布我的答案后刷新页面时对其进行了编辑。但是,是的。此代码存在多个问题。
        猜你喜欢
        • 1970-01-01
        • 2016-07-20
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-19
        • 2014-03-29
        • 1970-01-01
        相关资源
        最近更新 更多