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

标签 c++ c++11

已经为此工作了一段时间。在有两个子节点的情况下存在段错误。我不知道如何解决这个问题。我很确定其他情况是正确的,但我目前正在努力解决要删除的节点有 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->left ) 是 null您将访问 null下一次迭代中的指针。

关于c++ - 迭代地从二叉搜索树中删除节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62871312/

相关文章:

c++ - 使用另一个项目的 ImageMagick 静态编译会出现链接器错误

c++ - 多重虚拟继承中的虚拟表和内存布局

mysql - 在 MySQL 8.0+ 中使用 MySQL 驱动程序在 MySQL 语句中传递 C++ 变量

c++ - 这个素数发生器有什么问题?

c++ - 一个函数可以通过 const 引用*而不*接受临时变量作为参数吗?

c++ - const char 数组模板 vs char const* 函数重载

C++primer 第 5 篇关于 func 参数

c++ - lambda 函数/表达式是否支持 constexpr?

c++ - 为什么默认参数不能依赖于非默认参数?

c++ - 使用多个参数值调用模板函数