二进制树中的contains-method总是返回false java

时间:2014-06-30 19:42:14

标签: java binary-tree

有人可以解释为什么这个方法总是返回false吗?即使语句if(value == node.getValue())为真,该方法也返回false。与递归有关吗?我通过使用booelan变量来解决它,但我仍然很好奇为什么这不起作用。感谢。

public boolean contains(Node node, Integer value) {

    if(node != null && node.hasValue()) 
        if(value == node.getValue()) 
            return true;

    if(node.hasLeft())
        contains(node.getLeft(), value);
    if(node.hasRight())
        contains(node.getRight(), value);

    return false;
}

我的解决方案(bool是一个实例变量):

public boolean contains2(Node node, Integer value) {

    if(node != null && node.hasValue()) 
        if(value == node.getValue()) 
            bool = true;

    if(node.hasLeft())
        contains2(node.getLeft(), value);
    if(node.hasRight())
        contains2(node.getRight(), value);

    return bool;
}

3 个答案:

答案 0 :(得分:2)

您的递归电话

contains(node.getLeft(), value);

是否将值返回给您,但您从未对此值执行任何操作。相反,你忽略它,并且在遍历了所有节点之后,无论如何都返回false。您需要返回递归调用的值,这是您可以使用代码完成此操作的方法:

private boolean contains(Node node, Integer value) {
    if (node.getValue() == value) {
        return true;
    }

    boolean contains = false;
    if (node.hasLeft()) {
        contains = contains(node.getLeft(), value);
    }
    if (!contains && node.hasRight()) {
        contains = contains(node.getRight(), value);
    }

    return contains;
}

为了测试这个,我使用了:

public static void main(String[] args) throws Exception {

    Node top = new Node(5);
    top.setLeft(new Node(3));
    top.setRight(new Node(7));
    top.getLeft().setLeft(new Node(1));
    System.out.println("Contains 5? " + contains(top, 5));
    System.out.println("Contains 3? " + contains(top, 3));
    System.out.println("Contains 7? " + contains(top, 7));
    System.out.println("Contains 9? " + contains(top, 9));

}

这给了我输出:

Contains 5? true
Contains 3? true
Contains 7? true
Contains 9? false

答案 1 :(得分:2)

除了返回值的上述问题......

就目前而言,您的逻辑看起来只有在为填充树时使用的搜索中的参数“value”传入完全相同的Integer对象(引用)时才会起作用。如果你传入另一​​个Integer对象,即使其中包含相同的int值,你的== test也会失败。要解决此问题,请改用.equals方法。当然,除非你打算这样做。

答案 2 :(得分:1)

如果您不对其执行任何操作,则递归调用的返回值会丢失。试试:

public boolean contains(Node node, Integer value) {

    if(node != null && node.hasValue()) 
        if(value == node.getValue()) 
            return true;
    boolean found = false 
    if(node.hasLeft())
        found = contains(node.getLeft(), value);
    if(!found && node.hasRight())
        found = contains(node.getRight(), value);

    return found;
}