Java 如何在二叉搜索树的查找操作中使用return关键字

Java 如何在二叉搜索树的查找操作中使用return关键字,java,recursion,data-structures,return,binary-tree,Java,Recursion,Data Structures,Return,Binary Tree,这是我发现二叉树中是否存在特定节点的方法。这是我的方法,它运行良好 public boolean find(BinaryNode p,int x){ if(p==null){ return false ; } else{ if(x==p.element){ return true; } else if(x<p.ele

这是我发现二叉树中是否存在特定节点的方法。这是我的方法,它运行良好

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);
        }
    }


}  
由于递归调用而满足。然后将找到返回语句。
如果我在搜索一个不在树中的元素,最终我会找到这个语句

if(p==null){
返回false;
}
,我们在那里找到一条返回语句

因此,即使我在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);
        }
    }


}`
公共布尔查找(二进制节点p,int x){ if(p==null){ 返回false; } 否则{ if(x==p.element){ 返回true; } else if(x) 因此,即使我在else-if和else子句中也没有返回,不知怎的,我最终还是得到了一个返回语句,对吗

没有编译器不知道它。编译器不知道在运行时x和p的值是多少

编译器只需检查return语句的所有可能性,并且必须有方法的退出点

您需要提供在二叉树的右方向或左方向移动的逻辑


最后两个else if不负责实际返回find方法的结果,它只用于沿着树的正确方向移动。find方法的最终结果将由前两个if else子句得出。

您需要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));
        }
}
公共布尔查找(二进制节点p,int x)
{    
如果(p==null){
返回false;
}    
否则{

return(x==p.element)?true:(xHuh?如果调用
find(p.left,x);
时不返回任何内容,则不会返回任何内容。没有“最终到达返回语句”对于非void函数。如果你不告诉它,你认为它会返回什么?要理解为什么需要
return
s,请在纸上画一个调用树。如果你画了一个例子,其中有3个调用最终到达了末尾,你会看到由于没有向调用树发送结果,信息是如何丢失的。简言之:这是第一个需要重新调用的调用rn,不是最后一个,这是通过自下而上传播返回值来实现的。这是相同的方法。将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);
}