当我尝试在先前从二叉搜索树中删除某个数字后插入数字时,我收到运行时错误。我假设删除后在树中的某个地方,有一个破碎的路径,所以当它插入时会发生错误。我不确定我哪里出错了。我假设它将在remove函数中。以下是插入和删除功能:
void BST::insert(int x)
{
TreeNode * v = root;
if (root == NULL)
{
root = new TreeNode(x);
return;
}
if (x == v->key)
{
return;
}
while (x != v->key)
{
if (x < v->key)
{
if (v->left != NULL)
{
v = v->left;
}
else
{
v->left = new TreeNode(x);
return;
}
}
if (x > v->key)
{
if (v->right != NULL)
{
v = v->right;
}
else
{
v->right = new TreeNode(x);
return;
}
}
}
}
void BST::remove(TreeNode * & v, int x)
{
if (v == NULL)
return;
if (x < v->key)
{
remove(v->left, x);
}
if (x > v->key)
{
remove(v->right, x);
}
if (x == v->key)
{
if (v->left == NULL && v->right == NULL)
{
delete v;
return;
}
if (v->left == NULL)
{
TreeNode *temp = v;
v = v->right;
delete temp;
}
if (v->right == NULL)
{
TreeNode * temp = v;
v = v->left;
delete temp;
}
if (v->left != NULL && v->right != NULL)
{
TreeNode * u = v->right;
while (u->left != NULL)
{
u = u->left;
}
v->key = u->key;
remove(u, u->key);
}
}
}
答案 0 :(得分:0)
此代码存在多个问题,以及取消引用无效指针的几种方法。
在remove
中,当您找到匹配的密钥时,如果该节点没有子节点,则将其删除,但不要将指向删除节点的指针置空,留下悬空引用。
您有几个if
语句系列,应该是else if
。如果v->left == NULL
,您将v
更改为指向right
节点,则将此新值right
与NULL进行比较,最终可能会删除多个节点。