Проблема с вашей текущей функцией в том, что она берет ссылку.Мы не можем напрямую преобразовать его в цикл, потому что вы не можете переустановить ссылку (= указать ее где-то еще).
Однако мы можем сделать это с помощью указателя!Нам просто нужно добавлять *
каждый раз, когда мы его используем.
template<typename T>
T Btree<T>::_findmin(std::unique_ptr<node> &root)
{
std::unique_ptr<node> *curr = &root;
while (true) {
if (*curr && (*curr)->left == nullptr)
return (*curr)->data;
curr = &(*curr)->left;
}
}
И вот что у вас есть: итерационная версия вашей функции, ошибки и все.
Мы можем избавитьсяодного уровня косвенности, используя один из методов unique_ptr, get()
:
template<typename T>
T Btree<T>::_findmin(std::unique_ptr<node> &root)
{
node *curr = root.get();
while (true) {
if (curr && curr->left == nullptr)
return curr->data;
curr = curr->left.get();
}
}
Вместо того, чтобы работать поверх оболочек интеллектуальных указателей, мы просто получаем содержимое и используем необработанные базовые указатели.