Эта функция рекурсивно вызывает себя для поиска 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;
}
}
Вы, вероятно, хотите создать вспомогательный метод, который вызывает эту функцию поиска и выполняет печать. Что-то вроде:
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;
}
Других решений пока нет …