关于BST的重要例题
测试数据
输入
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
输出
Yes
No
No
#include<stdio.h>
#include<stdlib.h>
// 给你两个序列是否对应相同搜索树的判别
//建一颗树,然后其他序列和他去做比较
typedef struct TreeNode* Tree;
struct TreeNode{
int v;
Tree Left,Right;
int flag;//用来判别是不是一致的 如果没被访问过设为0 被访问变为1
};
//new 一个结点赋好初值
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==NULL)
T = NewNode(V);
else{
if(V>T->v)
T->Right = Insert(T->Right,V);
else
T->Left = Insert(T->Left,V);
}
return T;
}
//如何判别序列是否与树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{ //碰到了一个以前没碰到过的结点 如果是要找的,return 1
//如果不是的话 return 0
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;
return 1;
}
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;
}
void ResetT(Tree T)
{
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分别判别后面的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))//Judge读入后面的n个数,与T去比较
printf("YES\n");
else
printf("NO\n");
ResetT(T);//清除标记flag
}
FreeTree(T);
scanf("%d",&N);
}
return 0;
}