Двоичное дерево поиска, имеющее проблемы с функцией вставки
Я использую рекурсивные функции для вставки узла в мое двоичное дерево поиска. Программа работает путем создания корневого узла, если его нет. Корень - это указатель на структуру узла. Если корень уже существует, я вызываю рабочую функцию.
Примечание. Ключ - это 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
,