二叉排序樹插入刪除的實現

struct node
{
    node*lch,*rch;
    int key;
    node(int x):key(x){lch=rch=nullptr;}
};
using ptr=node*;
ptr insert(ptr p,int x)
{
    if(!p)return new node(x);
    if(x<p->key)p->lch=insert(p->lch,x);
    else p->rch=insert(p->rch,x);
    return p;
}
ptr erase(ptr p,int x)
{
    if(!p)return p;
    //當前非x所在的節點,在子樹上
    if(x<p->key)p->lch=erase(p->lch,x);
    else if(x>p->key)p->rch=erase(p->rch,x);
   //當前是x所在的節點,分三種情況
   //左子樹爲空,直接用右子樹頂替p的位置
    else if(!p->lch){
            ptr r=p->rch;
            delete p;return r;
    //有左子樹l,但l無右子樹,
    }else if(!p->lch->rch){
            ptr l=p->lch;
            l->rch=p->rch;
            delete p;return l;
    /*左子樹l有右子樹,找到最右下角的節點lr,該節點一定無右子樹,
      但可能有左子樹,如下設置*/
    }else{
            ptr l=p->lch;
            while(l->rch->rch)l=l->rch;
            ptr lr=l->rch;
            l->rch=lr->l;
            lr->lch=p->lch,lr->rch=p->rch;
            delete p;return lr;
    }
    return p;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章