删除二叉排序树的结点

有两个方法

法一:找到需要删除的结点后,用左子树最大的结点代替

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);
原文地址:https://www.cnblogs.com/zyqx/p/9530824.html