2013-03-15 7 views
0

이 함수는 순환 적으로 Btree를 검색하기 위해 자체적으로 호출하고 값이 있으면 true를 반환하고 값이 없으면 false를 반환합니다. 나는 또한 그것을 찾을 수 없다면 "찾지 못했습니다"한 번 끝에 끝내기를 원합니다. 그것은 그것이 스스로를 부르기 때문에 "발견되지 않는다"라는 말을 제외하고는 잘 동작합니다 (매번 발견하지 못하는 레벨을 내릴 때마다).B 트리 재귀 적 탐색 C++

bool lookup(int val, btnode *n) //returns true/false if value is in btree 
{ 

if (n==NULL) return false; //empty tree 

for (int i=0;i< n->count;i++) //check in present node for the val 
    if(n->value[i]==val) 
    { 
     flag = true; 
     return true; 
    } 



//check in child node 

    for(int i =0;i<n->count;i++) //check for child node 
    { if(val < n->value[i]) 
     { cout<<"checking a different node."<<endl; 
      lookup(val,n->child[i]); 
     } 
    } 
    if(val > n->value[(n->count)-1]) 
    { 
     cout<<"searching a right subtree"<<endl; 
     lookup(val, n->child[n->count]); 
    } 
if (flag==false) 
return false; 
else return true; 
} 

bool lookup2(int val, btnode *n) 
{ 
if(lookup(val, n)==false) 
{ 
    cout<<"not found"<<endl; 
    return false; 
} 
else 
{ 
    cout<<"Found it"<<endl; 
    return true; 
    } 
} 
+1

두 가지 기능이 있습니다. 하나는 실제 인쇄를하고, 지금은 작업을 재귀 적으로 수행하는 것입니다. – zz3599

+0

호출자가 여기에서 수행하려고하지 않고 호출자가이 작업을 수행하는 이유는 무엇입니까? – Tawnos

+0

'bool contains()'함수는'location find()'보다 거의 유용하지 않습니다. –

답변

2

아마도이 조회 함수를 호출하고 인쇄를 수행하는 보조 메서드를 만들고 싶을 것입니다. 다음과 같이하십시오 :

bool lookup_print(int val, btnode *n) { 
    bool found = lookup(val, n); 
    if (found) { 
     cout << "Found it!" << endl; 
    } else { 
     cout << "Not found..." << endl; 
    } 
    return found; 
} 

또한 노드를 찾으면 재귀 호출이 값을 반환하는지 확인해야합니다. 따라서 어디에서나 반복됩니다.

bool found = lookup(val,n->child[i]); 
if (found) { 
    return found; 
} 
+0

불행히도이 값을 루트 노드에 두지 않으면 "발견되지 않음"이라는 잘못된 값을 얻습니다. 나는. 함수는 참을 리턴하는 하위 노드를 탐색하지만 맨 위 함수는 false를 리턴합니다. 기본적으로, 그것이 진실로 돌아 오면 나는 끝내고 싶다. 재귀 사이클을 벗어나 사실로 돌아 간다. 그렇지 않으면 거짓을 반환합니다. – user1657563

+0

내 대답에도 두 번째 코드를 사용 했습니까? – Xymostech

+0

나는 당신의 조언을 듣고 lookup2라는 보조 기능을 추가했다. 내가 바꿔야 할 것은 그것이 발견되었을 때 true로 전환하는 정적 플래그를 두는 것이 었습니다. – user1657563