繁体   English   中英

迭代地从二叉搜索树中删除节点

[英]Remove Node from Binary Search Tree Iteratively

已经为此工作了一段时间。 在有两个子节点的情况下存在分段错误。 我不知道如何解决这个问题。 我很确定其他情况是正确的,但我目前正在努力解决要删除的节点有 2 个子节点的情况。

bool BinarySearchTree::remove(BinarySearchTree::TaskItem val) {
    if(!exists(val))
        return false;
    else{
        TaskItem* cur = root;
        TaskItem* parent = nullptr;

        if(size == 1){ // only one node in tree
            delete cur;
            root = nullptr;
            size--;
            return true;
        }
        else if(*cur == val && (!cur->right || !cur->left)){// root node is target, with one child node
            if(!cur->right){
                root = cur->left;
                delete cur;
            }
            else{
                root = cur->right;
                delete cur;
            }
            size--;
            return true;
        }

        while(!(*cur==val)){
            if(val.priority < cur->priority){
                parent = cur;
                cur = cur->left;
            }
            else{
                parent = cur;
                cur = cur->right;
            }
        }

        if(!cur->right && !cur->left){ // no child nodes
            if(parent->right == cur){
                parent->right = nullptr;
                delete cur;
            }
            else{
                parent->left = nullptr;
                delete cur;
            }
        }
        else if(cur->right && cur->left){ // 2 child nodes
            TaskItem* success = cur->right;
            TaskItem* par_success = cur;

            while(!success->left){
                par_success = success;
                success = success->left;
            }
            cur->priority = success->priority;
            cur->description = success->description;
            if(par_success->left == success){
                par_success->left = nullptr;
            }
            else{
                par_success->right = nullptr;
            }
            delete success;
        }
        else{// one child node
            if(!cur->right){ // child node on the left
                if(parent->right == cur){
                    parent->right = cur->left;
                    delete cur;
                }
                else{
                    parent->left = cur->left;
                    delete cur;
                }
            }
            if(!cur->left){
                if(parent->right == cur){
                    parent->right = cur->right;
                    delete cur;
                }
                else{
                    parent->left = cur->right;
                    delete cur;
                }
            }
        }
        size--;
        return true;
    }
}

您正在取消引用指针而不检查null

        while(!(*cur==val)){
            if(val.priority < cur->priority){
                parent = cur;
                cur = cur->left;
            }
            else{
                parent = cur;
                cur = cur->right;
            }
        }

如果cur->leftcur->rightnull (我想它们是指针)在*cur中访问它们将出现段错误。

在这:

        else if(cur->right && cur->left){ // 2 child nodes
            TaskItem* success = cur->right;
            TaskItem* par_success = cur;

            while(!success->left){
                par_success = success;
                success = success->left;
            }

您正在直接访问null指针。 如果cur->right->left (success- success->left ) 是null ,您将在以下迭代中访问null指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM