2014-05-25 5 views
1

이것은 특정 노드가 이진 트리에 있는지 찾는 내 방법입니다. 여기에는 내 방법이 있습니다. 내가 return 문 누락 등의 오류가 발생 else if(x<p.element){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){ 
      return find(p.left,x); 
     } 
     else { 
      return find(p.right,x); 
     } 
    } 


} 

내 질문입니다.
5,4,6,60,25,10 요소로 구성된 이진 트리가 있다고 가정 해보십시오. 내가 10을 검색하고 경우
그래서 재귀 calls.Then의 찾을 수 return 문이 때문에

if(x==p.element){ 
    return true; 

을 만족하는 시간이있다.
트리에없는 요소를 검색하는 경우 결국 문구에 도달하게됩니다.

if(p==null){ return false ; } 거기에 return 문이 있습니다. 따라서

도 나는 다른 의 반환을하지 않아도 및 다른 경우 절을 어떻게 든 거기에 내가 마지막으로 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); 
     } 
    } 


}` 
+1

어? 'find (p.left, x);'를 호출 할 때 어떤 것을 반환하지 않으면 아무 것도 반환되지 않습니다. void가 아닌 함수에 대해서는 "return statement"에 도달하지 않습니다. 당신이 그것을 말하지 않으면 무엇을 돌려 줄 것이라고 생각하니? – Dukeling

+0

'return's가 필요한 이유를 이해하려면 종이에 콜 트리를 그립니다. 마침내 끝나는 3 개의 호출로 예제를 그리면 호출 트리 위로 결과를 보내지 않음으로써 정보가 손실되는 방식을 확인할 수 있습니다. 간단히 말해서, 마지막 호출이 아니라 복귀가 필요한 첫 번째 호출이며, 이는 반환 값을 아래에서 위쪽으로 전파하여 수행됩니다. – keyser

답변

1

가장 가까운에 값을 반환해야

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

왼쪽 부분은 이미 결과를 결정할 때 자바의 ||&& 운영자가 자신의 오른쪽 부분 식을 평가하지 것이기 때문에. x==p.elementtrue 인 경우 나머지 줄을 평가하지 않고 true이 반환됩니다. 그렇지 않은 경우 동일한 규칙에 따라 (x<p.element && find(p.left,x))이 평가됩니다. x<p.element이 거짓 일 때 find(p.left,x)이 평가되지 않는 방법에 유의하십시오.

+0

같은 방법입니다. if-else를 삼항 연산자 방식으로 변환합니다. – Braj

+0

@Braj ???????? –

0

로 할 수 없어 심지어 내가의 반환을하지 않아도 다른 경우와 다른 절 어떻게 든 거기에 내가 마지막으로 return 문을 마우스 오른쪽 버튼으로 도달 할 수있는 방법?

아무 컴파일러도 모른다. 컴파일러는 런타임에 x와 p의 값이 무엇인지 알지 못합니다.

컴파일러는 return 문의 모든 가능성을 단순히 확인하고 메서드의 끝 점이 있어야합니다.

논리를 제공하여 이진 트리의 오른쪽 또는 왼쪽 방향으로 이동해야합니다.

마지막 두 개의 else-if는 실제로 트리의 오른쪽 방향으로 이동하는 데 사용 된 find 메소드의 결과를 실제로 반환 할 책임이 없습니다. 궁극적으로 find 메소드의 최종 결과는 처음 두 개의 if-else 절에서 나옵니다.

1

당신은 다른 경우에서 찾기 기능 때문에 문을 반환해야합니다 - else 문이 완료 후 호출자에게 반환하지만 첫 번째 통화 기능은 여전히 ​​발신자

관련 문제