簡體   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