任何人都可以帮我跟踪这段代码,如果它正确或不正确的话。我现在正在研究递归。
boolean search(Element element) {
Element c=first;
if(c==null)
return false;
else if(element.asset < c.asset)
if(c.left==null)
return false;
else
return search(c.left);
else if(element.data>c.data)
if(c.right==null)
return false;
else
return search(c.right);
else
return element.asset==c.asset;
}
答案 0 :(得分:3)
缺乏停止条件。你应该检查t.left == null,否则你会得到NullPointerException。另外,你应该返回t.left.isExist(..)
或t.right.isExist(...)
而不是isExist [你会想要在儿子身上调用这个方法]
目前,此版本将进入无限循环 - 因为您将始终检入相同的根节点。
答案 1 :(得分:1)
您的代码不对称。
一方,您拨打isExist(t.left)
,另一方拨打isExist(a.right)
您可能想要致电t.left.isExist(a)
和t.right.isExist(a)
,但这纯粹是推测性的,因为您没有完整的SSCCE供我们查看。
答案 2 :(得分:0)
它在语法上是正确的Java。但我不明白它怎么可能做你想要的。
看来'element'参数是你要搜索的东西,当前类中的'first'字段是二叉树的根。
目前还不清楚二叉树和搜索的关键字(在Element类中)是“资产”还是“数据”。 '小于'测试使用'资产',而'大于'测试使用'数据'。两条线似乎都应该使用相同的字段。可能这两个字段中的一个(“资产”或“数据”)应该不在此方法中完全引用。也许该方法的最后一行应该只是'return true;'?
(我怀疑上面的“停止条件”和“代码不对称”的答案都是错误的。但我可能错了:只用给出的代码很难判断。)
我同意无限循环很可能:我怀疑你需要创建第二个'搜索'函数,它接受两个'Element'参数 - 一个是要搜索的东西(比如当前的'element'参数)和另一个是要搜索的下一个元素 - 相当于当前局部变量'c'。我会对除第一行之外的当前“搜索”方法的主体中的所有内容进行“提取方法”重构,然后更改两个递归调用以使用新方法。
(其中一些是推测性的,基于我猜测你想要或想要什么,给出有限的信息。所以我当然可能是错误的。)