#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
// 判断是否同一棵二叉搜索树
/*
求解思路:
1. 搜索树表示
2. 建搜索树T
3. 判别一序列是否与搜索树一致
*/
// 搜索树表示
typedef struct TreeNode *Tree;
struct TreeNode {
int v;
Tree Left, Right;
int flag; // 判断该节点是否被访问过
};
Tree NewNode(int V)
{
Tree T = (Tree)malloc(sizeof(struct TreeNode));
T->v = V;
T->Left = T->Right = NULL;
T->flag = 0;
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 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;
}
int check(Tree T, int V)
{
if(T->flag) {
if(V < T->v) return check(T->Left, V);
else if(V > T->v) return check(T->Right, V);
else return 0;
}
else {
if(V == T->v) {
T->flag = 1;
return 1;
}
else return 0;
}
}
// 有bug版本
//int Judge(Tree T, int N)
//{
// int i, V;
//
// if(V != T->v) return 0;
// else T->flag = 1;
//
// for(i = 1; i < N; ++ i)
// {
// scanf("%d", &V);
// if(!check(T, V)) return 0;
// }
// return 1;
//}
int Judge(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) return 0;
else return 1;
}
void ResetT(Tree T) /* 清除T中各节点的flag标记 */
{
if(T->Left) ResetT(T->Left);
if(T->Right) ResetT(T->Right);
T->flag = 0;
}
void FreeTree(Tree T) /* 释放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");
ResetT(T); // 清除T中的标记flag
}
FreeTree(T);
scanf("%d", &N);
}
return 0;
}
/*
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
*/
原文:https://www.cnblogs.com/mjn1/p/11530248.html