/*两个序列是否对应相同搜索树的判别
两种判别方法
1、一种为建两棵树
2、一种为不建树
3、建一棵树,再判别其他序列是否和该树一样
使用第三种思路:
1、搜索树怎么表示*/
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
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;
}
}
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) //将flag标记清为0
{
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()
{
/*读入N和L根据第一行序列建树T,依据树T分别判别后面的
L个序列是否能与T形成,同一搜索树并输出结果*/
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
Yes
3 2 4 1
No
2 1
2 1
1 2
No
0