
4.二叉搜索树的实现:
//表示节点的结构体
struct node{
int val;
node *lch,*ch;
};
//插入数值x
node *insert(node *p,int x){
if (p==NULL){
node *q=new node;
q->val=x;
q->lch=q->rch=NULL;
return q;
}
else{
if (x<p->val)
p->lch=insert(p->lch,x);
else
p->rch=insert(p->rch,x);
return p;
}
}
//查找数值x
bool find(node *p,int x){
if (p==NULL)
return false;
else{
if (x==p->val)
return true;
else{
if (x<p->val)
return find(p->lch,x);
else
return find(p->rch,x);
}
}
}
//删除数值x
node *remove(node *p,int x){
if (p==NULL)
return NULL;
else{
if (x<p->val)
p->lch=remove(p-lrch,x);
else{
if (x>p->val)
p->rch=remove(p->rch,x);
else{ //找到数值x所在的节点
if (p->lch==NULL){ //需要删除的节点没有左儿子,那么就把右儿子提上去;
node *q=p->rch;
delete p;
return q;
}
else{ //需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去;
if (p->lch->rch==NULL){
node *q=p->lch;
q->rch=p->rch;
delete p;
return q;
}
else{ //需要删除的节点有左儿子&需要删除的节点的左儿子有右儿子,就把左儿子的子孙中最大的节点提到需要删除的节点上;
node *q;
for (q=p->lch;q->rch->rch!=NULL;q=q->rch);
node *r=q->rch;
q->rch=r->lch;
r->lch=p->lch;
r->rch=p->rch;
delete p;
return r;
}
}
}
}
return p;
}
}原文地址:http://blog.csdn.net/codeforcer/article/details/41117915