删除二叉搜索树中的节点中的 Visual Studio 中的访问冲突异常

Access Violation Exception in Visual Studio in Deletion of node in Binary Search Tree

本文关键字:Studio 访问冲突 异常 Visual 节点 搜索树 删除      更新时间:2023-10-16

我在运行BST Deletion时遇到异常。下面是我的代码片段:

Bst::node * Bst::del(node *root, int num)
{
    if (root == NULL)
    {
        return root;
    }
    else if (num < root->data)
    {
        root->left = del(root->left, num);
    }
    else if (num > root->data)
    {
        root->right = del(root->right, num);
    }
    else
    {
        if (root->left == NULL)
        {
            node * tmp = root;
            root = root->right;
            delete tmp;
        }
        else if (root->right == NULL)
        {
            node * tmp = root;
            root = root->left;
            delete tmp;
        }
        else if (root->left == NULL && root->right == NULL)
        {
            delete root;
            root = NULL;
        }
        else
        {
            node *tmp = root;
            tmp = findMin(root->right);
            root->data = tmp->data;
            root->right = del(root->right, tmp->data);
        }
    }

    return root;
}
//

/

void Bst::del(int num)
{
    del(root, num);
}
当我删除其他节点时,

一切正常,但是当我删除根节点本身时,函数void Bst::del(int num)从函数Bst::node * Bst::del(node *root, int num)获取垃圾值。当我将函数重写为

  void Bst::del(int num)
        {
            root = del(root, num);
        }

问题1.为什么当我删除中间节点或除根节点以外的任何其他节点时它有效。在调试时,我发现当函数Bst::node * Bst::del(node *root, int num)正在执行时,即使是root也会被正确删除,但是当调用返回到void Bst::del(int num)时,root的值没有得到保留并且是垃圾。

问题 2:为什么当我将返回值存储在变量根中时修复了错误?

假设你有一个名为 root 的成员变量,那么问题可能是因为你在删除函数中用参数root root隐藏了成员变量。因此,当您在函数中执行root = NULL时,仅将参数设置为 NULL,而不将成员变量设置为成员变量。

root的其他赋值也存在问题,它们只会分配给局部参数而不是成员变量。

我认为,您所做的修复(在调用函数中分配给root)是最正确的解决方案。