рекурсия — B-дерево рекурсивного поиска Переполнение стека

Эта функция рекурсивно вызывает себя для поиска Btree и возвращает true, если значение найдено, и false, если оно не найдено. Я также хочу, чтобы он обнаружил, что «не найден» один раз в конце, если он не найден. Он работает хорошо, за исключением того, что он говорит «не найден» много раз (каждый раз, когда он падает на уровень, который он говорит, что не найден), так как он вызывает себя.

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

0

Решение

Вы, вероятно, хотите создать вспомогательный метод, который вызывает эту функцию поиска и выполняет печать. Что-то вроде:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]