欢迎!
我有一个名为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;
}
我想知道这是对的还是我错过了什么?我必须返回真假吗?
答案 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
。
另外,当你说“小于”时,你要比较相等,所以你实际上是在检查所有值是否等于整数,而不是小于它。