【问题标题】:Access Violation Exception in Visual Studio in Deletion of node in Binary Search Tree删除二叉搜索树中的节点时 Visual Studio 中的访问冲突异常
【发布时间】:2015-01-21 19:55:47
【问题描述】:

运行BST Deletion 时出现异常。 下面是我的代码sn-p:

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中时错误得到修复?

【问题讨论】:

    标签: c++ tree


    【解决方案1】:

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

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

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

    【讨论】:

    • 但我调试并检查了root = NULL 部分不会命中我的输入为 1,2,3,4 并且我正在尝试删除 1. 表示根节点的情况。
    • @tanz 但是你确实有 other 分配给root,这些也只会分配给本地root 参数而不是this-&gt;root
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    相关资源
    最近更新 更多