BST删除操作

来源:互联网 发布:司法考试鲁迅姓周 知乎 编辑:程序博客网 时间:2024/05/21 11:29
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;}


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

0 0
原创粉丝点击