递归搜索二叉树

时间:2011-08-07 12:44:41

标签: java binary-search-tree

任何人都可以帮我跟踪这段代码,如果它正确或不正确的话。我现在正在研究递归。

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;
}

3 个答案:

答案 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'。我会对除第一行之外的当前“搜索”方法的主体中的所有内容进行“提取方法”重构,然后更改两个递归调用以使用新方法。

(其中一些是推测性的,基于我猜测你想要或想要什么,给出有限的信息。所以我当然可能是错误的。)