求解思路:先建一棵树,再判别其他序列是否与该树一致。
/*
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;
}