题干:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
如果序列相同则输出YES,否则输出NO。
因为咱第一次建二叉树,就很蠢的用map来建(体感没有问题(
findson,findson2函数基本一样,只是在用stl传map出锅了,就换了这种写法(
代码如下:
#include<cstdio>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=2e2+7;
int len;
char cmp[maxn],ori[maxn];
struct node
{
char l='x',r='x',root='x';
bool operator!=(const node a)const
{
return l!=a.l||r!=a.r||root!=a.root;
}//node代表二叉树的每一个节点,l代表左儿子,r代表右儿子,root代表父亲节点,x代表该点为空
};
map<char,node>mp,mp2;
//findson每一次迭代会更新关于fa的左右节点,递归更新二叉树节点
void findson(char fa,char str[],int limit)
{
int lok=0,rok=0;
char copy[20];
for(int i=1;i<=len;++i)copy[i]=str[i];
if(limit>fa)
{
for(int i=1;i<=len;++i)
if(copy[i]>limit)copy[i]='x';
}
else
{
for(int i=1;i<=len;++i)
if(copy[i]<limit)copy[i]='x';
}
for(int i=1;i<=len;++i)
{
if(copy[i]=='x')continue;
if(copy[i]<fa)
{mp[fa].l=copy[i],copy[i]='x',lok=1;break;}
}
for(int i=1;i<=len;++i)
{
if(copy[i]=='x')continue;
if(copy[i]>fa)
{mp[fa].r=copy[i],copy[i]='x',rok=1;break;}
}
mp[mp[fa].l].root=fa;
if(lok)mp[mp[fa].l].root=fa,findson(mp[fa].l,copy,fa);
if(rok)mp[mp[fa].r].root=fa,findson(mp[fa].r,copy,fa);
}
void findson2(char fa,char str[],int limit)
{
int lok=0,rok=0;
char copy[20];
for(int i=1;i<=len;++i)copy[i]=str[i];
if(limit>fa)
{
for(int i=1;i<=len;++i)
if(copy[i]>limit)copy[i]='x';
}
else
{
for(int i=1;i<=len;++i)
if(copy[i]<limit)copy[i]='x';
}
for(int i=1;i<=len;++i)
{
if(copy[i]=='x')continue;
if(copy[i]<fa)
{mp2[fa].l=copy[i],copy[i]='x',lok=1;break;}
}
for(int i=1;i<=len;++i)
{
if(copy[i]=='x')continue;
if(copy[i]>fa)
{mp2[fa].r=copy[i],copy[i]='x',rok=1;break;}
}
mp2[mp2[fa].l].root=fa;
if(lok)mp2[mp2[fa].l].root=fa,findson2(mp2[fa].l,copy,fa);
if(rok)mp2[mp2[fa].r].root=fa,findson2(mp2[fa].r,copy,fa);
}
int main()
{
int n;
while(scanf("%d",&n),n)
{
mp.clear();
scanf("%s",ori+1);
len=strlen(ori+1);
char tmp=ori[1];ori[1]='x';
findson(tmp,ori,1000);
for(int i=1;i<=n;++i)
{
mp2.clear();int can=1;
scanf("%s",cmp+1);
tmp=cmp[1];cmp[1]='x';
findson2(tmp,cmp,1000);
for(int j=0;j<=9;++j)
{
if(mp[j+'0']!=mp2[j+'0'])
{can=0;break;}
}
if(can)puts("YES");
else puts("NO");
}
}
return 0;
}