#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10
typedef struct Tree_node {
int data;
struct Tree_node* left;
struct Tree_node* right;
}Tree;
typedef struct Tree_node* pTree;
pTree createtree(int n); //创造二叉树
void deltree(pTree p);//直接清空二叉树
int cmptree(pTree p1, pTree p2);//对比两棵树,相同返回1,不同则0
pTree insert(pTree BST, int x); //二叉树的插入
int main()
{
int n, l;
int print[MAXSIZE]; //存放两颗树对比的结果,方便后面输出。
for (int i = 0; i < MAXSIZE; i++) print[i] = 0;
int cnt;
cnt = 0;
scanf("%d", &n);
while (n)
{
scanf("%d", &l);
pTree p1 = createtree(n); //初始序列
for (int i = 0; i < l; i++)
{
pTree p2 = createtree(n); //要对比的序列
print[cnt++] = cmptree(p1, p2);
deltree(p2);
}
deltree(p1);
scanf("%d", &n);
}
for (int i = 0; i < cnt; i++)
{
if (print[i]) printf("YES");
else printf("NO");
if (i < cnt - 1) printf("\n");
}
return 0;
}
pTree createtree(int n) //实质是运用插入函数
{
pTree p = NULL;
int x;
for (int i = 0; i < n; i++)
{
scanf("%d", &x);
p = insert(p, x); //插入函数
}
return p;
}
pTree insert(pTree BST, int x) //插入函数
{
if (!BST) //空树时
{
BST = (pTree)malloc(sizeof(Tree));
BST->data = x;
BST->left = BST->right = NULL;
}
else
{
if (x < BST->data)
BST->left = insert(BST->left,x);
else
BST->right = insert(BST->right,x);
}
return BST;
}
int cmptree(pTree p1, pTree p2) //实质是遍历二叉树看里面数据是否相同
{ //一开始令is=1,如果一旦不用则为0返回递归。
if (!p1 && !p2) return 1;
else if (!p1 && p2 || p1 && !p2) return 0;
int is = 1;
if (p1->data == p2->data)
{
is = cmptree(p1->left, p2->left);
if (is == 0) return 0;
is = cmptree(p2->right, p2->right);
if (is == 0) return 0;
}
else
return is = 0;
return is;
}
void deltree(pTree p)
{ /*就是把创造的树一键销毁*/
if (p == NULL) return;
pTree p1, p2;
p1 = p->left;
p2 = p->right;
free(p);
deltree(p1);
deltree(p2);
}