刪除二叉排序樹的結點


有兩個方法

法一:找到需要刪除的結點后,用左子樹最大的結點代替

void DeleteNode(BiTree &root,KeyType x){
    if(root == NULL){
        return;
    }
    if(root->key>x){
        DeleteNode(root->lchild,x);//遍歷到的結點值比所給值大,就需要遍歷左子樹
    }else if(root->key<x){
        DeleteNode(root->rchild,x);//遍歷到的結點值比所給值小,就需要遍歷右子樹
    }else{ //查找到了刪除節點
        //左或者右結點為空只需要將剩下的右或者左子樹換上去
        if(root->lchild == NULL){ //左子樹為空
            BiTree tempNode = root;
            root = root->rchild;
            free(tempNode);
        }else if(root->rchild == NULL){ //右子樹為空
            BiTree tempNode = root;
            root = root->lchild;
            free(tempNode);
        }else{//左右子樹都不為空
            //一般的刪除策略是左子樹的最大數據 或 右子樹的最小數據 代替該節點
            //(這里采用查找左子樹最大數據來代替,最大是在左子樹的最右那個節點
            BiTree tempNode = root->lchild;//找左子樹
            if(tempNode->rchild!=NULL){
                tempNode = tempNode->rchild;//找左子樹的右子樹
            }
            root->key = tempNode->key;//將右子樹的值賦給需要刪除的那結點
            DeleteNode(root->lchild,tempNode->key);//刪除右子樹

            
        }
    }
}

法二 找右子樹最小的來代替,然后再刪除那個小的

//與上面代碼不同的地方
BiTree tempNode = root->rchild;
            if(tempNode->lchild!=NULL){
                tempNode = tempNode->lchild;
            }
            root->key = tempNode->key;
            DeleteNode(root->rchild,tempNode->key);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM