尝试在先前在BST中删除节点后插入时出现运行时错误

时间:2016-02-17 01:06:59

标签: c++ insert binary-search-tree

当我尝试在先前从二叉搜索树中删除某个数字后插入数字时,我收到运行时错误。我假设删除后在树中的某个地方,有一个破碎的路径,所以当它插入时会发生错误。我不确定我哪里出错了。我假设它将在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);          
        }
    }
}

1 个答案:

答案 0 :(得分:0)

此代码存在多个问题,以及取消引用无效指针的几种方法。

remove中,当您找到匹配的密钥时,如果该节点没有子节点,则将其删除,但不要将指向删除节点的指针置空,留下悬空引用。

您有几个if语句系列,应该是else if。如果v->left == NULL,您将v更改为指向right节点,则将此新值right与NULL进行比较,最终可能会删除多个节点。