Вы вызываете неопределенное поведение, поскольку не все пути кода ваших рекурсивных функций возвращают значение. Это может привести к «ошибке времени выполнения», ошибке sh или просто к непредсказуемому результату.
Кстати, преимущество дерева поиска обычно состоит в том, что вы получаете среднее время доступа к вашим элементам во время выполнения. сложность n * log (n). Но для этого дерево необходимо упорядочить, и я не могу себе представить допустимый вариант использования неупорядоченного двоичного дерева; в этом случае связанный список тоже подойдет.
В случае упорядоченного дерева:
node *btree::search(int key, node *leaf){
if(leaf != NULL)
{
if(key == leaf->value) {
return leaf;
} else if (key < leaf->value) {
return search(key, leaf->left);
} else {
return search(key, leaf->right);
}
}
else
{
return NULL;
}
}
В случае неупорядоченного дерева:
node *btree::search(int key, node *leaf){
if(leaf != NULL)
{
if(key == leaf->value) {
return leaf;
}
leaf = search(key, leaf->left);
if (! leaf) {
leaf = search(key, leaf->right);
}
return leaf;
}
else
{
return NULL;
}
}