前序遍历和中序遍历可以唯一确定一棵二叉树,而对二叉排序树而言,相同元素的二叉排序树中序遍历一定相同,而不同元素二叉排序树使用前序遍历就可以发现不相同,所以只需要前序遍历两个二叉树,比较一下就可以判断,下面是代码:

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
struct node
{
    char val;
    node *lchild, *rchild;
    node(int v):val(v), lchild(NULL), rchild(NULL){}
};
bool flag;
node *insert(node *root, int x) //依次插入每个值
{
    if (root == NULL) //节点为空时,插入此节点
    {
        root = new node(x);
        return root;
    }
    if (root->val > x)                         //如果这个值小于左儿子
        root->lchild = insert(root->lchild, x); //递归向下寻找相应的位置,回溯赋值,构建链表
    else                                        //同理
        root->rchild = insert(root->rchild, x);
    return root;
}
void check(node *root, node *judge) //传入标准树和判断树的地址
{
    if (root != NULL && judge != NULL) //如果两个地址都不为空,即此节点两棵树都有值,只需判断值是否相同
    {
        if (root->val != judge->val)      //判断此节点的值是否和标准树一致
            flag = false;
        check(root->lchild, judge->lchild); //前序遍历
        check(root->rchild, judge->rchild);
    }
    else if (root != NULL || judge != NULL) //如果两颗树中,只有一棵树在这个节点有值,那么这两棵树肯定不一致
        flag = false;
}
int main()
{
    int n;
    while (~scanf("%d", &n) && n)
    {
        node *root = NULL; //标准树地址为空
        string s;
        cin >> s;
        for (int i = 0, len = s.length(); i < len; i++) //构建一颗标准树
            root = insert(root, s[i]);
        for (int i = 0; i < n; i++) //n组数据
        {
            flag = true;       //标记
            node *judge = NULL; //判断树地址为空
            cin >> s;
            for (int i = 0, len = s.length(); i < len; i++) //构建判断树
                judge = insert(judge, s[i]);
            check(root, judge); //中序遍历,检查两棵树是否一致
            if (flag)
                printf("YES\n");
            else
                printf("NO\n");
        }
    }
}