Удаление конечного узла в BST, вызывающего ошибкуC++

Программы на C++. Форум разработчиков
Гость
Удаление конечного узла в BST, вызывающего ошибку

Сообщение Гость »

Я создаю двоичное дерево поиска на C++. Оно состоит из узлов, содержащих указатель на родителя, указатели на левого и правого дочерних элементов, целочисленный ключ и значение шаблона, как показано ниже.

Код: Выделить всё

template  class Node {
private:
Node* parent;
Node* left;
Node* right;

unsigned int key;
T value;

public:
/*constructors, accessors, mutators, rotating functions are here*/
У меня есть отдельный класс для самого дерева, который в основном предназначен только для вставки, балансировки дерева, поиска и удаления узлов. В этом классе функция удаления узла берет ключ и удаляет этот узел из дерева. На данный момент я убедился, что все функции вращения, балансировки, вставки и доступа работают правильно. При создании функции удаления узлов из дерева я столкнулся с проблемой при удалении корня. Ниже представлена ​​функция удаления.

Код: Выделить всё

//This currently is only for deleting leaf nodes
void remove(unsigned int key) {
//Find the node being deleted
Node* delnode = this->select(key);
if (!delnode) { return; };

//If the value is a leaf node
if (!delnode->getLeft() && !delnode->getRIght()) {
//Store the parent node
Node* parent = delnode->getParent();

//The node is both root and leaf
if (!parent) {
delete delnode;
return;
};

//If the node is not a root, clip the parent connection
if (delnode->getKey() < parent->getKey()) {
parent->setLeft(NULL);
delnode->setParent(NULL);
} else if (delnode->getKey() > parent->getKey()) {
parent->setRight(NULL);
delnode->setParent(NULL);
};

//Delete the node now
delete delnode;
return;
};
};
Самый маленький участок кода, который надежно вызывает ошибку, — это следующий раздел приведенной выше функции.

Код: Выделить всё

if (!parent) {
delete delnode;
return;
};
Другие разделы кода работают, насколько я могу проверить, и правильно удаляют конечные узлы. Удаление корня дерева (независимо от того, были ли у него дочерние элементы) вызывает «двойное освобождение();» ошибка при выходе из программы.
Я не могу найти ошибку в моем предыдущем коде, которая могла бы привести к тому, что использование «delete» привело бы к выдаче «double free();» ошибка, в чем может быть причина?

Подробнее здесь: https://stackoverflow.com/questions/781 ... sing-fault

Вернуться в «C++»