我正在尝试创建一个删除函数(不使用递归),它传入我要删除的节点的值。
我当前的问题是我的析构函数似乎使程序崩溃(出现运行时错误),这可能是因为我没有在删除函数中正确删除根节点。
我试图用来删除根的代码在这里:
bool BST::remove_root (int val)
{
if (val == root_->val)
{
if (root_->left == NULL && root_->right != NULL)
{
Node* temp = root_->right;
delete root_;
root_ = NULL;
size_--;
root_ = temp;
return true;
}
else if (root_->right == NULL && root_->left != NULL)
{
Node* temp = root_->left;
delete root_;
root_ = NULL;
size_--;
root_ = temp;
return true;
}
else
{
Node *curr = root_->right, *child = root_->left;
delete root_;
root_ = NULL;
size_--;
root_ = curr;
Node* temp = curr;
while (temp->left != NULL)
temp = temp->left;
temp->left = child;
return true;
}
}
}
在我的代码中,仅使用 val 本身就是传递给 remove 函数(我要删除的那个)的值。当我取消引用 root_->val 之类的东西时,我正在访问我的 BST 类中的 val。
我真的不明白为什么这不能连续删除根节点(就像我说我认为它是使程序崩溃的析构函数),但我觉得它可能是无效指针?