有人可以解释为什么这个方法总是返回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;
}
答案 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;
}