微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

抛出异常:BST删除期间读取访问冲突

如何解决抛出异常:BST删除期间读取访问冲突

因此在删除期间出现异常问题(抛出异常:读取访问冲突。 父对象是0x158398。)就像有时是不同的数字等,并且总是关于父对象/指针,我的代码运行正常,没有任何错误,直到100k对象异常有时才工作,因为1百万甚至不再工作。能帮上大忙。在帖子中发布代码

节点类:

template <class T>
class Node {

public:
    T data;
    Node<T>* Left = NULL;
    Node<T>* Right = NULL;
};

用于查找右侧子树的最小值的代码

Node<T>* findMin(Node<T>* node)
    {
        while (node->Left != NULL)
            node = node->Left;
        return node;
    }

删除代码

void Delete(Node<T>*& node) {

    if (node == NULL)
        return;

    Node<T>* parent = findParentForDelete(this->root,node);
    Node<T>* temp = NULL;


    //leafs
    if (node->Left == NULL && node->Right == NULL) {
        if (node == root) {
            delete root;
            root = NULL;
            return;
        }
        else {
            if (parent->Left == node)   //line with exception
                parent->Left = NULL;
            else
                parent->Right = NULL;
            delete node;
            node = NULL;
            return;
        }
    }
    //1 child left not null
    else if (node->Left != NULL && node->Right == NULL)
    {
        if (node == root) {
            temp = root->Left;

            delete root;
            root = NULL;

            root = temp;
            return;

        }
        else {
            if (parent->Left == node)
                parent->Left = node->Left;
            else
                parent->Right = node->Left;

            delete node;
            node = NULL;
            return;

        }
    }
    //1 child Right not null
    else if (node->Left == NULL && node->Right != NULL)
    {
        if (node == root) {
            temp = root->Right;

            delete root;
            root = NULL;

            root = temp;
            return;
        }
        else {
            if (parent->Left == node)
                parent->Left = node->Right;
            else
                parent->Right = node->Right;

            delete node;
            node = NULL;
            return;
        }
    }
    //2 childs
    else if (node->Left != NULL && node->Right != NULL)
    {
        temp = findMin(node->Right);
        T data = temp->data;
        Delete(temp);
        node->data = data;
}
}

寻找父母:

Node<T>* findParentForDelete(Node<T>* node,Node<T>*& nodetoFind)
    {
        if (node == NULL)
            return NULL;

        if (node->Left == NULL && node->Right == NULL)
            return NULL;

        if ((node->Left != NULL && node->Left == nodetoFind)
            || (node->Right != NULL && node->Right == nodetoFind))
            return node;

        if (node->data->age > nodetoFind->data->age)
            return findParentForDelete(node->Left,nodetoFind);

        if (node->data->age < nodetoFind->data->age)
            return findParentForDelete(node->Right,nodetoFind);
    }

解决方法

findParentForDelete并不总是返回值。

如果您要查找的节点的年龄与树中的其他节点相同,则不会返回值,因此返回给调用方的值将是垃圾值。

如果在编译时提高警告级别,大多数编译器都会对此发出警告。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。