[英]how to use return keyword in a find operation in binary search tree
这是我发现二叉树中是否存在特定节点的方法,这是我的方法,可以正常工作。
public boolean find(BinaryNode p,int x){
if(p==null){
return false ;
}
else{
if(x==p.element){
return true;
}
else if(x<p.element){
return find(p.left,x);
}
else {
return find(p.right,x);
}
}
}
我的问题是,如果不在else if(x<p.element){
和else {
内插入return关键字 , else if(x<p.element){
由于缺少return语句而收到错误。
假设我有一棵由元素5,4,6,60,25,10组成的二叉树。
因此,如果我要搜索10,
if(x==p.element){
return true;
由于递归调用而感到满意,然后找到一个return语句。
如果我正在搜索不在树中的元素,最终我会到达以下语句
if(p==null){ return false ; }
if(p==null){ return false ; }
,我们找到一个return语句。
因此,即使我在else if和else子句中都没有return的某种方式,也有一种方法可以使我最终到达return语句,那么在else if和else子句中没有return关键字怎么了?
为什么我必须在那里?
我为什么不能这样做
`public boolean find(BinaryNode p,int x){
if(p==null){
return false ;
}
else{
if(x==p.element){
return true;
}
else if(x<p.element){
find(p.left,x);
}
else {
find(p.right,x);
}
}
}`
您需要return语句,因为else if-else语句中的find函数将在完成后返回给调用方,但是首次调用函数仍必须向调用方返回一个值
您希望if-else if-else子句的行为最接近的方式是使用?
条件表达式:
public boolean find(BinaryNode p,int x)
{
if(p==null) {
return false ;
}
else {
return (x==p.element)?true:(x<p.element?find(p.left,x):find(p.right,x));
}
}
另一个选择是将要返回的值存储在局部变量中,并且仅在方法末尾返回它:
public boolean find(BinaryNode p,int x)
{
boolean returnValue = false;
if(p!=null)
{
if(x==p.element){
returnValue = true;
}
else if(x<p.element){
returnValue = find(p.left,x);
}
else {
returnValue = find(p.right,x);
}
}
return returnValue;
}
我最喜欢的方法是使用逻辑表达式的短路求值:
public boolean find(BinaryNode p,int x)
{
if(p==null) return false;
return x==p.element || (x<p.element && find(p.left,x)) || find(p.right,x);
}
由于Java的||
当左侧部分已经确定其结果时, &&
运算符将不会评估其右侧部分的表达式。 如果x==p.element
为true
,那么将返回true
而不评估其余的行。 如果不是,则将遵循相同规则评估(x<p.element && find(p.left,x))
。 请注意find(p.left,x)
当x<p.element
为false时find(p.left,x)
如何不计算find(p.left,x)
。
因此,即使我在else if和else子句中都没有返回值,以某种方式我最终还是可以到达return语句的吗?
没有编译器对此一无所知。 编译器在运行时不知道x和p的值是什么。
编译器仅检查return语句的所有可能性,并且方法的出口必须存在。
您需要提供在二进制树的向右或向左移动的逻辑。
最后两个else-if并不负责实际返回只用于沿树的正确方向移动的find方法的结果。 最终,find方法的最终结果将由前两个if-else子句得出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.