//注意循环for(idx++.不是N++) //注意root2,尽管root2替换为空指针了,但是还是要free掉 #include <cstdio> #include <vector> #include <string> using namespace std; struct Tree { // Tree data structure char data; Tree* left; Tree* right; Tree(char data) { this->data = data; this->left = NULL; this->right = NULL; } }; void insertBST(int data, Tree*& root) { if (root == NULL) { root = new Tree(data); return; } Tree* pCur = root; while (true) { if (data < pCur->data) { if (pCur->left == NULL) { pCur->left = new Tree(data); break; } pCur = pCur->left; } else { if (pCur->right == NULL) { pCur->right = new Tree(data); break; } pCur = pCur->right; } } } string Inorder(Tree* root) { if (root == NULL) { return ""; } else return Inorder(root->left) + root->data + Inorder(root->right); } string Preorder(Tree* root) { 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++) { insertBST(str1[i], root1); } string mid1 = Inorder(root1); string pre1 = Preorder(root1); char str2[100]; for (int idx = 0; idx < n; idx++) { scanf("%s", str2); Tree* root2 = NULL; for (int i = 0; str2[i] != '\0'; i++) { insertBST(str2[i], root2); } string mid2 = Inorder(root2); string pre2 = Preorder(root2); if (mid1 == mid2 && pre1 == pre2) { printf("YES\n"); } else { printf("NO\n"); } // Free memory delete root2; } } return 0; }