基本思路:先构造一个初始二叉树进行比较,在对其下面的的n个序列再造BST树,然后再进行比较
代码如下
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const int N=30;
int v1[N],l1[N],r1[N];
int v2[N],r2[N],l2[N];
int idx=0;
void insert1(int &u,int w)
{
if(!u)
{
u=++idx;
v1[u]=w;
}
else if(w<v1[u]) insert1(l1[u],w);
else insert1(r1[u],w);
}
void dfs1(int u,string &f)
{
if(u)
{
f=f+char(v1[u]+'0');
dfs1(l1[u],f);
dfs1(r1[u],f);
}
}
void insert2(int &u,int w)
{
if(!u)
{
u=++idx;
v2[u]=w;
}
else if(w<v2[u]) insert2(l2[u],w);
else insert2(r2[u],w);
}
void dfs2(int u,string &k)
{
if(u)
{
k=k+char(v2[u]+'0');
dfs2(l2[u],k);
dfs2(r2[u],k);
}
}
int main()
{
int t;
while(cin >> t&&t)
{
idx=0;
memset(v1,0,sizeof v1);
memset(l1,0,sizeof l1);
memset(r1,0,sizeof r1);
string a;cin >> a;
int len = a.size();
int root1=0;
for(int i=0;i<len;i++)
{
insert1(root1,a[i]-'0');
}
string f="";
dfs1(root1,f);
while(t--)
{
memset(v2,0,sizeof v2);
memset(l2,0,sizeof l2);
memset(r2,0,sizeof r2);
idx=0;
string b;cin >> b;
int len2=b.size();
int root2=0;
for(int i=0;i<len2;i++)
{
insert2(root2,b[i]-'0');
}
string k="";
dfs2(root2,k);
if(k==f)cout << "YES" << endl;
else cout << "NO" << endl;
}
}
}