Java使用递归返回布尔值true
我试图查看我的二叉搜索树中是否包含一个值,并使用递归遍历该树。问题是函数返回false作为调用堆栈上的最后一个值,而不是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
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;
}