求解思路:先建一棵树,再判别其他序列是否与该树一致。
/* 4 2 3 1 4 2 3 4 1 2 3 2 4 1 2 1 2 1 1 2 0 */ #include<stdio.h> #include<stdlib.h> // 数据结构 typedef struct TreeNode *Tree; struct TreeNode { int data; Tree left, right; int flag; }; Tree NewNode(int data) { Tree T = (Tree)malloc(sizeof(struct TreeNode)); T->data = data; T->left = T->right = NULL; T->flag = 0; return T; } Tree InsertNode(Tree T, int data) { if (!T) { T = NewNode(data); } else { if (data < T->data) T->left = InsertNode(T->left, data); else T->right = InsertNode(T->right, data); } return T; } Tree MakeTree(int N) { int i, data; scanf("%d", &data); Tree T = NewNode(data); for (i = 1; i < N; i++) { scanf("%d", &data); T = InsertNode(T, data); } return T; } int CheckNode(Tree T, int data) { if (T->flag) { if (data < T->data) return CheckNode(T->left, data); else if (data > T->data) return CheckNode(T->right, data); else return 0; } else { if (data == T->data) { T->flag = 1; return 1; } else return 0; } } int Judge(Tree T, int N) { int i, data; scanf("%d", &data); if (data == T->data) T->flag = 1; else return 0; for (i = 1; i < N; i++) { scanf("%d", &data); if (!CheckNode(T, data)) { return 0; } } return 1; } void ResertTFlag(Tree T) { if (T->left) ResertTFlag(T->left); if (T->right) ResertTFlag(T->right); T->flag = 0; } void FreeTree(Tree T) { if (T->left) FreeTree(T->left); if (T->right) FreeTree(T->right); free(T); } int main() { int N, L, i; Tree T; scanf("%d", &N); while (N) { scanf("%d", &L); // 根据第一行序列建树 T = MakeTree(N); for (i = 0; i < L; i++) { if (Judge(T, N)) // 判定 printf("YES!\n"); else printf("NO!\n"); ResertTFlag(T); } FreeTree(T); scanf("%d", &N); } return 0; }