/*
二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
题意就是判断两个序列是否代表同一棵树;
*/
//二叉搜索树 叉排
#include<iostream>
#include<string>
using namespace std;
//建立节点
struct Node
{
int value;
Node* left;//
Node* right;
Node(int v)
{
left = right = NULL;
value = v;
}
};
//插入
void insertNode(Node* &root, int v)
{
if(root == NULL)
{
root = new Node(v);
return ;
}
if(v < (root->value))
insertNode(root->left, v);
else
insertNode(root->right, v);
}
//删除
void deleteTree(Node* &root)
{
if(root != NULL)
{
deleteTree(root->left);
deleteTree(root->right);
delete root;
}
}
//建树
void buildTree(Node* &root, string tr)
{
int i, len=tr.length();
for( i=0; i < len; i++ )
insertNode(root, tr[i]);
}
//比较
bool compare(Node* &a, Node* &b)
{
if( a!=NULL && b!=NULL )
{
if((a->value) == (b->value))
{
if(!(compare(a->left, b->left))) return false;
if(!(compare(a->right, b->right))) return false;
}
else return false;
}
return true;
}
int main()
{
Node* root;
Node* tg;
int n;
string str1, str2;
while(cin >> n && n)
{
cin >> str1;
root = NULL;
buildTree(root, str1);
while(n--)
{
cin >> str2;
tg = NULL;
buildTree(tg, str2);
if(compare(root, tg))
cout << "YES" << endl;
else
cout << "NO" << endl;
deleteTree(tg);
}
deleteTree(root);
}
return 0;
}