typedefstructTreeNode *Tree; structTreeNode { int v; Tree Left, Right; int flag; };
Tree MakeTree( int N ); Tree Insert( Tree T, int V ); Tree NewNode( int V ); intcheck( Tree T, int V ); intJudge( Tree T, int N ); voidResetT( Tree T );// 清除T中各结点的flag标记
intmain() { 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"); } ResetT(T); /*清除T中的标记flag*/ } scanf("%d", &N); } return0; }
Tree MakeTree(int N) { Tree T; int i, V; scanf("%d", &V); T = NewNode(V); for (i = 1; i < N; i++) { scanf("%d", &V); T = Insert(T, V); } return T; }
Tree Insert( Tree T, int V ) { if ( !T ) { T = NewNode(V); } else { if ( V > T->v ) { T->Right = Insert( T->Right, V ); } else { T->Left = Insert( T->Left, V ); } } return T; }
Tree NewNode( int V ) { Tree T = (Tree)malloc(sizeof(struct TreeNode)); T->v = V; T->Left = T->Right = NULL; T->flag = 0; return T; }
intcheck( Tree T, int V ) { if ( T->flag ) { if ( V < T->v ) { return check(T->Left, V); } elseif ( V > T->v ) { return check(T->Right, V); } else { return0; } } else { if ( V == T->v ) { T->flag = 1; return1; } else { return0; } } }
intJudge( Tree T, int N ) { int i, V, flag = 0; // flag: 0代表目前还一致,1代表已经不一致 scanf("%d", &V); if ( V != T->v ) { flag = 1; } else { T->flag = 1; } for (i = 1; i < N; i++) { scanf("%d", &V); if ((!flag) && (!check(T, V))) { flag = 1; } } if (flag) { return0; } else { return1; } }
voidResetT( Tree T ) { if (T->Left) { ResetT(T->Left); } if (T->Right) { ResetT(T->Right); } T->flag = 0; }