Как найти элемент в бинарном дереве поиска?

Я пытался построить 2-3 узла. Функция добавления работает должным образом и была подтверждена мной до сих пор. Единственная проблема — это функция поиска, которая вызывается для поиска элемента внутри узла 2-3. Кажется, это не работает вообще. Указатель совпадения внутри не принимает возвращенное значение из find_rec метод вообще, хотя я уже назначил его. Он просто получает новый заданный адрес всякий раз, когда вызывается функция, и я понятия не имею, почему она это делает. Может кто-нибудь мне помочь ? и скажи мне, что я сделал не так? Спасибо

**LValue and RValue**

E LValue() {return _first._value;}
E RValue() {return _second._value;}**find function**

// Assuming this set contains an element y such that (x == y),
// return a reference to y. Such a y must exist; if it does not an
// assertion will fail.
E& find(E& x)
{
// the match pointer is supposed to take
// returned pointer from the find_rec function
// Yet, it is not doing that at all.
E* match = find_rec(x, _root);
assert(match != nullptr);
return *match;
}**find_rec function**

// Helper function: find recursion
// function returns a pointer
E* find_rec(E& x, BNode<E>* root)
{
if(root == nullptr)
return nullptr;
else
{
// 2-node
if(!root->IsThree())
{
if(x == root->LValue())
return &root->LValue();
else if (x < root->LValue())
return find_rec(x, root->GetLeft());
else
return find_rec(x, root->GetRight());
}
// 3-node
else
{
if(x == root->LValue())
return &root->LValue();
else if(x == root->RValue())
return &root->RValue();
else if(x < root->LValue())
return find_rec(x, root->GetLeft());
else if(x < root->RValue())
return find_rec(x, root->GetMiddle());
else
return find_rec(x, root->GetRight());
}
}
}

1

Решение

Код явно способен возвращать nullptr, когда нужное значение отсутствует в дереве.

В тот момент, когда он попадает в эту ситуацию, активатор активирует и *match возврат не получится. Я ожидаю, что вам нужно изменить сигнатуру функции, чтобы обеспечить тип возвращаемого значения, который учитывает этот случай.

1

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

Из кода кажется, что вы возвращаете адрес локального временного.

Я не могу быть уверен, потому что LValue() Объявление метода не отображается, но если оно возвращает содержимое узла по значению, а не по ссылке, тогда find_rec Функция просто вернет мусор (адрес временно выделен в стеке).

Кстати, достойный компилятор должен выдать предупреждение за это.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector