//踩坑:1.递归Preorder写错了! //2.idx的++,写成n++ #include <cstring> #include <string> using namespace std; struct Tree { //树的数据结构 注意下面的指针 char data; Tree* left; Tree* right; }; void insertBST(char data, Tree*& root) { //BST一开始是空的,根据data输入建立BST Tree* pnew = new Tree; //set up 新结点 pnew->data = data; // 新结点初始化 (3步:数值,空指针) pnew->left = NULL; pnew->right = NULL; if (root == NULL) { //根是空的,根就是新来的 结点 root = pnew; } else { Tree* pPre = root; //造两个指针,father: Pre 跟随者, son: Cur 探路者! Tree* pCur; while (true) { if (data < pPre->data) { //一级判断:新来的数,比根节点小 pCur = pPre->left; if (pCur == NULL) { pPre->left = pnew; break; //二级:当左子树是空,那么正好pnew插左子树 } else { pPre = pCur; //二级:当左子树不空:让pPre降级为pCur-----继续往左边走,继续循环 } } if (data > pPre->data) { pCur = pPre->right; if (pCur == NULL) { pPre->right = pnew; break; } else pPre = pCur; } } } } string Inorder(Tree* root) { //sequence of mid if (root == NULL) { return""; } else return Inorder(root->left) + root->data + Inorder(root->right); } string Preorder(Tree* root) { //sequence of pre if (root == NULL) { return""; } else return root->data + Preorder(root->left) + Preorder(root->right); } int main() { int n; while (scanf("%d", &n) != EOF) { if (n == 0) { break; } char str1[100]; scanf("%s", str1); Tree* root1 = NULL; for (int i = 0; str1[i] != '\0'; i++) { //str1 insertBST(str1[i], root1); } string mid1 = Inorder(root1); string pre1 = Preorder(root1); char str2[100]; for (int idx = 0; idx < n; idx++) { //处理字符串2 的大循环----字符串2可以有多个,而1只有一个 scanf("%s", str2); Tree* root2 = NULL; for (int i = 0; str2[i] != '\0'; i++) { //str2 insertBST(str2[i], root2); } string mid2 = Inorder(root2); string pre2 = Preorder(root2); if (mid1 == mid2 && pre1 == pre2) { printf("YES\n"); } else printf("NO\n"); } } }