BST删除操作

struct stu
{
    int val;
    stu* lc;    //左孩子
    stu* rc;    //右孩子
};

stud* deleteMin(stud* subroot,stud*& min)
{
    if(subroot->lc == NULL)
    {
        min = subroot;      //左孩子为空,则根节点就是最小节点
        return subroot->rc;     //根节点最小,要删掉,所以返回右孩子
    }
    //左孩子不为空,根节点不是最小的,递归调用deleteMin,删除右子树的最小节点
    subroot->rc = deleteMin(subroot,min);
    return subroot;
}

stru* delete(stud *subroot,int val)
{
    if(subroot==NULL)   //树为空
        return NULL;
    if(subroot->val > val)  //val在左子树中
        //递归调用delete,在左子树中查找并删除val,同时更新左子树状态
        subroot->lc = delete(subroot->lc,val);
    else if(subroot->val < val) //val在右子树中
        //递归调用delete,在右子树中查找并删除val,同时更新右子树状态
        subroot->rc = delete(subroot->rc,val);
    else{       //找到节点
        //左节点为空,直接返回根的右节点,注意右节点也可能为空,但是没关系
        if(subroot->lc == NULL)
            subroot = subroot->rc;
        //右节点为空,则返回根的左节点,注意右节点也可能为空,但是没关系
        else if(subroot->rc == NULL)
            subroot = subroot->lc;
        else{       //左右孩子节点都不为空
            stud* temp;
            subroot->rc = deleteMin(subroot->rc,temp);      //获取并删除右子树最小节点,更新右子树
            subroot->val = temp->val;       //用最小节点temp的值val替换根节点的内容
        }
    }
    return subroot;
}





比较基础的内容,主要是要注意函数的递归调用,一开始在子树更新这块我没绕过来,所以不能理解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值