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;
}
二叉排序樹插入刪除的實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.