Я создал класс структуры данных дерева, который выделяет память для реализации узла. Функция удаления успешно находит и удаляет выделенную память для узла дерева, но у меня проблемы с установкой фактического узла в nullptr. Моя функция удаления создает указатель узла дерева и устанавливает его в адрес удаляемого узла. Я удаляю этот указатель и устанавливаю его в nullptr, но узел дерева затрагивается только удалением и не устанавливается в nullptr. Поэтому, это становится мусором и портит мою программу.
Проблема начинается со случая 2, где моя функция удаления проверяет, является ли узел листом.
template <class DType>
bool Tree<DType>::remove(DType toDelete)
{
if (head == nullptr) {
return false;
}
if (!check_existence(toDelete)) // CASE 1: Node does not exist.
{
std::cout << "Remove Error: " << toDelete << " does not exist." << std::endl;
return false;
}
TreeNode<DType>* nodeToDelete = find(toDelete); // Address of node to be deleted.
TreeNode<DType>* nodeToDelete_left = nodeToDelete->get_left();
TreeNode<DType>* nodeToDelete_right = nodeToDelete->get_right();
if (!(nodeToDelete_left) && !(nodeToDelete_right)) // CASE 2: Node is a leaf.
{
nodeToDelete->delete_nodes(nodeToDelete);
nodeToDelete = nullptr;
nodeCount--;
return true;
}
TreeNode<DType>* temp = nullptr;
if ((nodeToDelete_left != nullptr) ^ (nodeToDelete_right != nullptr)) // CASE 3: Node has one child.
{
temp = nodeToDelete;
if (nodeToDelete_left) // 3A: Left child exists
{
nodeToDelete = nodeToDelete_left;
}
if (nodeToDelete_right) // 3B: Right child exists.
{
nodeToDelete = nodeToDelete_right;
}
delete temp;
temp = nullptr;
nodeCount--;
return true;
}
// CASE 4: Node has two children
temp = find_min(nodeToDelete_right);
nodeToDelete->set_data(temp->get_data());
delete temp;
temp = nullptr;
nodeCount--;
return true;
}