额……这个问题……
就用BST模板(这真的是我写的比较得意的模板)说吧……
代码上来了!!
#include<bits/stdc++.h>
using namespace std;
int n;
int ROOT=1;
struct tree{
int data;
int l,r;
int fa;
tree(const int _data=-1,const int _l=-1,const int _r=-1,const int _fa=-1)
{
data=_data;
l=_l;
r=_r;
fa=_fa;
}
}a[40000];
/*========插入========*/
void into(int sum,int now,int tot)
{
if(sum<a[now].data)
if(a[now].l!=-1)
into(sum,a[now].l,tot);
else {
a[now].l=tot;
a[a[now].l].data=sum;
a[a[now].l].fa=now;
// cout<<"l:"<<a[a[now].l].data<<" ";
}
else if(sum>a[now].data)
if(a[now].r!=-1)
into(sum,a[now].r,tot);
else {
a[now].r=tot;
a[a[now].r].data=sum;
a[a[now].r].fa=now;
// cout<<"r:"<<a[a[now].r].data<<" ";
}
}
/*========查找========*/
int find(int now,int sum)
{
// cout<<now<<endl;
if(a[now].data==sum) return now;
if(sum<a[now].data)
if(a[now].l!=-1) return find(a[now].l,sum);
else return 0;
else if(sum>a[now].data)
if(a[now].r!=-1) return find(a[now].r,sum);
else return 0;
}
void init2()
{
cin>>n;
int i,x;
for(i=1;i<=n;i++){
cin>>x;
if(find(ROOT,x)) printf("Yes
");
else printf("No
");
}
}
/*========前驱========*/
int pred(int now)
{
if(a[now].r!=-1) return pred(a[now].r);
else return now;
}
/*========删除========*/
bool Delete(int now)
{
if(a[now].r==-1&&a[now].l==-1){
if(a[a[now].fa].l==now) a[a[now].fa].l=-1;
if(a[a[now].fa].r==now) a[a[now].fa].r=-1;
return 1;
}
else if(a[now].l!=-1&&a[now].r==-1){
if(a[a[now].fa].l==now){
a[a[now].fa].l=a[now].l;
a[a[now].l].fa=a[now].fa;
}
if(a[a[now].fa].r==now){
a[a[now].fa].r=a[now].l;
a[a[now].r].fa=a[now].fa;
}
return 1;
}
else if(a[now].l==-1&&a[now].r!=-1){
if(a[a[now].fa].l==now){
a[a[now].fa].l=a[now].r;
a[a[now].l].fa=a[now].fa;
}
if(a[a[now].fa].r==now){
a[a[now].fa].r=a[now].r;
a[a[now].r].fa=a[now].fa;
}
return 1;
}
else if(a[now].l!=-1&&a[now].r!=-1){
int left=a[now].l;
int rep=pred(left);
if(a[a[now].fa].l==now){
Delete(rep);
a[a[now].fa].l=rep;
a[rep].l=a[now].l;
a[a[now].l].fa=rep;
a[rep].r=a[now].r;
a[a[now].r].fa=rep;
}
else if(a[a[now].fa].r==now){
Delete(rep);
a[a[now].fa].r=rep;
a[rep].l=a[now].r;
a[a[now].l].fa=rep;
a[rep].r=a[now].r;
a[a[now].r].fa=rep;
}
else {
Delete(rep);
ROOT=rep;
if(a[now].l!=-1){
a[rep].l=a[now].l;
a[a[now].l].fa=rep;
}
if(a[now].r!=-1){
a[rep].r=a[now].r;
a[a[now].r].fa=rep;
}
}
return 1;
}
return 0;
}
void init3()
{
cin>>n;
int i,x;
for(i=1;i<=n;i++){
cin>>x;
int now=find(ROOT,x);
// cout<<now<<endl;
if(now==0) printf("No number!
");
else {
if(Delete(now))
printf("%d has now been deleted.
",x);
else printf("...");
}
}
}
/*========构建========*/
void init()
{
cin>>n;
int x,tot;
for(tot=1;tot<=n;tot++){
scanf("%d",&x);
if(tot==1)
a[tot].data=x;
else
into(x,1,tot);
}
// cout<<endl;
}
/*========遍历========*/
void bl(int how,int now)
{
if(how==1){
cout<<a[now].data<<" ";
if(a[now].l!=-1)
bl(1,a[now].l);
if(a[now].r!=-1)
bl(1,a[now].r);
}
if(how==2){
if(a[now].l!=-1)
bl(2,a[now].l);
cout<<a[now].data<<" ";
if(a[now].r!=-1)
bl(2,a[now].r);
}
if(how==3){
if(a[now].l!=-1)
bl(3,a[now].l);
if(a[now].r!=-1)
bl(3,a[now].r);
cout<<a[now].data<<" ";
}
}
int main()
{
freopen("BST.in","r",stdin);
freopen("BST.out","w",stdout);
init();
bl(1,ROOT);
printf("
");
bl(2,ROOT);
printf("
");
bl(3,ROOT);
printf("
");
init2();
init3();
bl(1,ROOT);
printf("
");
bl(2,ROOT);
printf("
");
bl(3,ROOT);
printf("
");
return 0;
}
言简意赅,是不是??
还有,一些适当的注释(不要多了)可以帮助自己与别人更好的理解!