#include using namespace std; typedef struct TreeNode * Tree; struct TreeNode { int data; Tree left, right; int flag; }; Tree NewNode(int V) { Tree T = (Tree)malloc(sizeof(struct TreeNode)); T->data = V; T->left = T->right = NULL; T->flag = 0; return T; } Tree Insert(Tree T,int V)//二叉排序树的插入方式 { if(T) { if(V > T->data) T->right = Insert(T->right,V); else T->left = Insert(T->left,V); } else T = NewNode(V); return T; } Tree MakeTree(int N) { Tree R; int i, V; cin>>V; R = NewNode(V); for( i = 1; i < N; i ++) { cin>>V; R = Insert(R,V); } return R; } int check(Tree T,int V) { if(T->flag)//如果当前节点查找过了 { if(V < T->data) return check(T->left,V);//此时要查找的数小于该节点的数,去左边查找 else if(V > T->data) return check(T->right,V);//大于该节点的数,去右边查找 else return 0;//如果相等则不一致 } else//如果当前节点没查找过 { if(V == T->data)//如果是要查找的节点则标记为查找过 { T->flag=1; return 1; } else return 0;//如果当前节点没被查找过还不是要查找的节点,则不一致 } } int judge(Tree T,int N) { int i, V, flag = 1; cin>>V; if(V == T->data) T->flag = 1; //1代表目前还一致 else flag = 0; for( i =1 ; i < N ; i ++) { cin>>V; if(flag&&(!check(T,V))) flag=0;//如果check不一致,则整棵树不一致 } if(flag) return 1; else return 0; } void ResetFlag(Tree T) { if( T -> left) ResetFlag(T->left); if( T -> right) ResetFlag(T->right); T->flag = 0; } void TreeFree(Tree T) { if( T -> left) TreeFree(T->left); if( T -> right) TreeFree(T->right); free(T); T=NULL; } int main () { Tree T;//初始化数 int N, L, i; cin>>N; while(N) { cin>>L; T = MakeTree(N);//建本次事例的初始化对比树 for ( i = 0; i < L; i ++ ) { if (judge(T,N)) cout<<"Yes"<>N; } }