Java递归二叉树

时间:2009-10-16 18:48:23

标签: java recursion binary-tree

欢迎! 我有一个名为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; 
}

我想知道这是对的还是我错过了什么?我必须返回真假吗?

4 个答案:

答案 0 :(得分:2)

有更多优雅,OO方式来写这个。我的建议是使less()成为TN类的非静态成员函数。这样,如果树的根节点被称为root,则只需调用root.less()。然后,每次拨打less()都会拨打left.less()right.less()

由于您发布了甚至无法编译的示例代码,我想知道您是使用IDE还是尝试使用javac编译您的类。如果您不熟悉Java,我强烈建议您使用Eclipse,Netbeans或其他IDE。

答案 1 :(得分:1)

return less(s, toFind); 

应该是:

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

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

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

if (s == null) return true;

(编辑:当所有节点满足条件时,这将使您获得真实的结果。那里的==应该是&lt;)。 编辑:好的,你有很多问题,而不仅仅是我提到的问题。您需要在逻辑上单步执行代码。

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

答案 2 :(得分:0)

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

语句return less(null, toFind);一直在调用你的方法 - 你将溢出你的堆栈。

答案 3 :(得分:0)

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

另外,当你说“小于”时,你要比较相等,所以你实际上是在检查所有值是否等于整数,而不是小于它。