http://ac.jobdu.com/problem.php?pid=1009
// 浙大10机试
// 九度:1009
//
// 二叉排序(搜索)树的建立、存储
// 数的先序,后序,中序遍历
// 通过先序+中序、中序+后序、中序+层次可以唯一的确定一棵二叉树
// 当需要使用时,这些创建节点,建立二叉排序树、先、中、后遍历,
// 骨架不需要改变,改变的仅仅是visit(T->data);的操作及
// main函数中的控制
#include <stdio.h>
#include <string.h>
struct Node
{
Node *lc;
Node *rc;
char data;
};
Node Tree[300];//所有的书,都保存在这个数组中,每建一个树,建立一个跟指针就可以了
int loc;//必不可少,仅仅在while内初始化一次
char str1[25], str2[25];
int size1, size2;
char *str;//设置全局指针后,就可以访问字符串,而不需要在函数切换时传值
int *size;//先序遍历与中序遍历的结果连接起来保存在一个字符串中
Node *Creat()
{
Tree[loc].lc = Tree[loc].rc = NULL;
return &Tree[loc++];
}
void Pre(Node *T)
{
str[(*size)++] = T->data;
if(T->lc != NULL)
{
Pre(T->lc);
}
if(T->rc != NULL)
{
Pre(T->rc);
}
}
void In(Node *T)
{
if(T->lc != NULL)
{
In(T->lc);
}
str[(*size)++] = T->data;
if(T->rc != NULL)
{
In(T->rc);
}
}
Node *Insert(Node * T, char ch)
{
if(T == NULL)
{
T=Creat();
T->data = ch;
//return T;
}
else if(T->data < ch)
{
T->rc = Insert(T->rc, ch);
}
else if(T->data > ch)
{
T->lc = Insert(T->lc, ch);
}
return T;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("E:\\in.txt", "r", stdin);
//freopen("E:\\out.txt", "w", stdout);
#endif
int n;
while(scanf("%d", &n) && n != 0)
{
Node *T1 = NULL;
loc=0;//仅仅在此初始化
char s[12];
scanf("%s", s);
for(int i=0; s[i] != 0; i++)
{
T1=Insert(T1, s[i]);
}
size1=0;//变量使用前初始化
str = str1;
size = &size1;
Pre(T1);
In(T1);
str1[size1]=0;
while(n--!=0)
{
Node *T2 = NULL;
scanf("%s", s);
for(int i=0; s[i] != 0; i++)
{
T2=Insert(T2, s[i]);
}
size2=0;
str = str2;
size = &size2;
Pre(T2);
In(T2);
str2[size2]=0;
puts(strcmp(str1, str2)==0 ? "YES":"NO");
}
}
return 0;
}