Java使用递归返回布尔值true

Java使用递归返回布尔值true,java,recursion,Java,Recursion,我试图查看我的二叉搜索树中是否包含一个值,并使用递归遍历该树。问题是函数返回false作为调用堆栈上的最后一个值,而不是true 以下是伪代码: public boolean containsValue(Node node, Value v) { if (node.value.equals(v)) { return true; } containsValue(node.left, v); // <- search left tree containsV

我试图查看我的二叉搜索树中是否包含一个值,并使用递归遍历该树。问题是函数返回false作为调用堆栈上的最后一个值,而不是true

以下是伪代码:

public boolean containsValue(Node node, Value v) {

   if (node.value.equals(v)) {
     return true;
   } 
   containsValue(node.left, v); // <- search left tree
   containsValue(node.right, v); // <- search right tree

   return false;
}

那么我该如何解决这个问题呢?

这解决了眼前的问题,但这不是搜索二叉树的正确或有效的方法,因为它不决定向左或向右看,只是默默地向左然后向右看。正确的答案是


如果左侧节点包含它,或者(
|
)右侧节点包含它,则希望返回true

return containsValue(node.left, v) || containsValue(node.right, v);
请注意,如果左侧包含它,它将短路,并且不会向右看

return containsValue(node.left, v) || containsValue(node.right, v);
你甚至可以做整个事情:

return node.value.equals(v) ||
       containsValue(node.left, v) ||
       containsValue(node.right, v);

您可以检查任何一个分支是否返回true,并在尝试返回false之前传递它

public boolean containsValue(Node node, Value v) {

   if (node.value.equals(v)) {
       return true;
   } else if (containsValue(node.left, v)) {
       return true;
   } else if (containsValue(node.right, v)) {
       return true;
   }

   return false;
}
好了

public boolean containsValue(Node node, Value value){
    int result = node.value.compareTo(value);
    if(result == 0){
        return true;
    }else if(result < 0){
        if(node.left != null){
            return containsValue(node.left, v);
        }
        return false;
    }else{
        if(node.right != null){
            return containsValue(node.right, v);
        }
        return false;
    }
}

有些人喜欢一句台词:

public boolean containsValue(Node node, Value v) {
    return node.value.equals(v) || containsValue(node.left, v) || containsValue(node.right, v);
}
public boolean包含值(节点,值v){
如果(节点值等于(v)){
返回true;
} 
else if(包含值(node.left,v))

return true;//这是查找二元搜索树的不正确实现。根据定义,二元搜索树的值越左越小,越右越大,并且此方法没有利用此属性,使得搜索效率更低。@nickzoum你说得对!我解决了immedi问题ATE问题是一个有组织的树,我没有把它删除。一旦OP更改接受了,我甚至会删除。@ Kingamere,请把你应得的答案改成尼克。谢谢,但是你可以编辑你的答案,这样就可以了。
public boolean containsValue(Node node, Value v) {
    return node.value.equals(v) || containsValue(node.left, v) || containsValue(node.right, v);
}
  public boolean containsValue(Node node, Value v) {

   if (node.value.equals(v)) {
     return true;
   } 
   else if(containsValue(node.left, v))
     return true; // <- search left tree

   else if(containsValue(node.right, v)) // <- search right tree
    return true;

   return false;
}