2013-03-15 2 views
0

Эта функция рекурсивно вызывает себя для поиска Btree и возвращает true, если значение найдено, и false, если оно не найдено. Я также хочу, чтобы он «не нашел» один раз в конце, если он не найден. Он отлично работает, за исключением того, что он говорит «не найден» много раз (каждый раз, когда он опускается ниже уровня, который он говорит, не найден), так как он называет себя.B-tree рекурсивный поиск 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

Я пробовал это, к сожалению, я получаю ложное «не найдено», если значение не находится в корневом узле. То есть функция переходит к дочернему узлу, который возвращает true, но затем верхняя функция возвращает false. В принципе, если он вернет истину, я хочу сделать это, вырваться из цикла рекурсии и вернуть true. В противном случае верните false. – user1657563

+0

Вы также использовали второй бит кода в моем ответе? – Xymostech

+0

Хорошо, я принял ваш совет и добавил вспомогательную функцию под названием lookup2. Я должен был изменить статический флаг, который изменится на true, когда он будет найден. – user1657563

Смежные вопросы