查找树的基本操作
第一行输入 一个整数n,
第二行接下来n个整数,互不相同,
第三行输入一个整数m<=n;
接下来m行每行一个整数为要删除的整数都是上面出现过的整数。
View Code
/*
其中没有相同的元素
*/
#include<iostream>
using namespace std;
typedef struct findtree
{
int date;
int v;//以v为根更有多少节点
struct findtree *left,*right,*pre;
struct findtree()
{
v=1;
left=right=NULL;
}
}findtree;
bool flag=false;
void addtree(findtree *root,int key)
{
root->v++;
if(key<root->date)
{
if(root->left==NULL)
{
findtree *r=new findtree;
r->date=key;
root->left=r;
r->pre=root;
return ;
}
else addtree(root->left,key);
}
else if(key>root->date)
{
if(root->right==NULL)
{
findtree *r=new findtree;
r->date=key;
root->right=r;
r->pre=root;
return ;
}
else addtree(root->right,key);
}
}
findtree *findleftmax(findtree *root)
{
root=root->left;
root->v--;
while(root->right!=NULL)
{
root=root->right;
root->v--;
}
return root;
}
findtree *find(findtree *root,int key)
{
root->v--;
if(key==root->date) return root;
else if(key>root->date) return find(root->right,key);
else return find(root->left,key);
}
void deletetree(findtree *root,int key)
{
findtree *r=new findtree;
if(flag) r=root;
else r=find(root,key);
if(r->left==NULL&&r->right==NULL)//叶子节点
{
if(r->pre==NULL) //根节点
{
return ;
}
if(r->date<r->pre->date)
{
r->pre->left=NULL;return ;
}
if(r->pre->date<r->date)
{
r->pre->right=NULL;return ;
}
}
else if(r->left==NULL)//左边无孩子
{
findtree *t=new findtree;
t=r->right;
r->date=t->date;
r->left=t->left;
r->right=t->right;
if(r->right!=NULL) r->right->pre=t->pre;
if(r->left!=NULL) r->left->pre=t->pre;
}
else if(r->right==NULL)//右边无孩子
{
findtree *t=new findtree;
t=r->left;
r->date=t->date;
r->left=t->left;
r->right=t->right;
if(r->right!=NULL) r->right->pre=t->pre;
if(r->left!=NULL) r->left->pre=t->pre;
}
else //有两个孩子
{
findtree *t=new findtree;
int tt;
t=findleftmax(r);
tt=t->date;
flag=true;//标记使得顶点不会重复减
deletetree(t,t->date);
flag=false;//回朔非常关键
r->date=tt;
}
}
void output(findtree *root)
{
if(root->v==0) return ;
if(root->left!=NULL)output(root->left);
cout<<"("<<root->date<<","<<root->v<<") ";
if(root->right!=NULL)output(root->right);
}
int main()
{
int n;
while(cin>>n)
{
int i,t;
cin>>t;
findtree *root = new findtree;
root->date=t;
root->pre=NULL;
for(i=1;i<n;i++)
{
cin>>t;
addtree(root,t);
}
output(root);cout<<endl;
int m;
cin>>m;
for(i=0;i<m;i++)
{
cin>>t;
deletetree(root,t);
output(root);
cout<<endl;
}
}
return 0;
}
/*
10
5 2 4 1 8 0 9 6 3 7
10
3
8
5
4
1 3 2 4
4
1
2
3
4
3
2 1 3
3
3
2
1
6
5 2 6 1 4 3
6
5
4
3
2
1
6
4
3 2 4 1
4
3
2
1
4
*/


浙公网安备 33010602011771号