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;
}
二叉排序树插入删除的实现
最新推荐文章于 2022-08-29 16:43:54 发布