http://acm.hdu.edu.cn/showproblem.php?pid=3791
思路:建好二叉搜索树后,用二叉树的历遍去判断就好
#include<iostream>
#include<cstring>
using namespace std;
typedef struct tree
{
tree *r,*l;
int num;
}tree;
tree *root;
int a[30],b[30],count=0;
tree *creat(int x)
{
tree *t=(tree *)malloc(sizeof(tree));
t->r=0;
t->l=0;
t->num=x;
return t;
}
tree *inster(tree *s,int x)
{
tree *t;
if(s==NULL)
{
t=creat(x);
s=t;
}
else
{
if(x<=s->num)
s->l=inster(s->l,x);
else
s->r=inster(s->r,x);
}
return s;
}
void libian(tree *root)
{
if(root!=NULL)
{
b[count++]=root->num;
libian(root->l);
libian(root->r);
}
}
int main()
{
int n;
while(scanf("%d",&n)>0&&n)
{
count=0;
root=NULL;
char str[30];
scanf("%s",str);
int len=strlen(str);
int i,j;
for(i=0;i<len;i++)
{
int tmp=str[i]-48;
root=inster(root,tmp);
}
libian(root);
for(i=0;i<len;i++)
a[i]=b[i];
while(n--)
{
count=i=0;
scanf("%s",str);
root=NULL;
for(i=0;i<len;i++)
{
int tmp=str[i]-48;
root=inster(root,tmp);
}
libian(root);
for(i=0;i<len;i++)
if(a[i]!=b[i])
{
printf("NO\n");
break;
}
if(i>=len)
printf("YES\n");
}
}
return 0;
}