Двоичное дерево поиска, имеющее проблемы с функцией вставки

Я использую рекурсивные функции для вставки узла в мое двоичное дерево поиска. Программа работает путем создания корневого узла, если его нет. Корень - это указатель на структуру узла. Если корень уже существует, я вызываю рабочую функцию.

Примечание. Ключ - это int, а Item - строка.

При вызове рабочей функции, current->key(-858993460) а также current->item(Error reading characters of string) не ожидаются values (1, "Harrold"),

Рекурсия продолжается до тех пор, пока не произойдет это исключение:

"Exception thrown: read access violation. current was 0xCCCCCCCC."

Key k а также Item i их ожидаемая стоимость. Только поэтому я пытаюсь получить к ним доступ Node* Корень, что они меняются, и я не уверен, почему это происходит.

Любая помощь приветствуется

void BST::insert(Key k, Item i)
{
    if (root == nullptr) {
        root = &Node(k, i);
    }
    else insertRec(k, i, root);
}

void BST::insertRec(Key k, Item i, Node* current)
{

    if (current->key == k)//if the key of the inserted node is = to an existing key, change the item.
    {
        current->item = i;
    }
    else if (current->key > k)//if the key of the current node is larger than key inserted traverse leftchild recursively calling function
    {
        if (current->leftChild != nullptr)
            insertRec(k, i, current->leftChild);
        else
            current->leftChild = &Node(k, i);
    }
    else if (current->key < k)
    {
        if (current->rightChild != nullptr)
            insertRec(k, i, current->rightChild);
        else
            current->rightChild = &Node(k, i);
    }
}

1 ответ

Решение

Теперь, когда вы создаете новые узлы для дерева, вы создаете временный экземпляр Node объект, а затем сохраняя адрес этого объекта. Это то, что &Node(k, i) делается.

Проблема в том, что временное устройство выйдет из области видимости, и теперь ваш BST содержит Node указатели, указывающие на то, чего не существует. Это, скорее всего, причина, по которой ваша программа останавливается с ошибками неверного адреса.

Так что вместо

&Node(k,i),

использование

new Node(k, i),

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

Тогда, конечно, вы несете ответственность за освобождение памяти для BST, когда пришло время уничтожить дерево. Вот когда вам нужно пройти через узлы дерева и вызвать delete на каждой Node,

Другие вопросы по тегам