给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式:
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查的序列。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
输出格式:
对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。
输入样例:
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
输出样例:
Yes
No
No
本题思路:创建出两个二叉搜索树,采用先序遍历进行两颗树的比较,有不同的直接输出No即可;
#include<stdio.h>
#include<stdlib.h>
int Flag;//全局变量flag
typedef struct tree{
int date;
struct tree *left,*right;
}Bintree;
Bintree *insert(Bintree *bt,int x);//插入函数
void printS(Bintree *t1,Bintree *t2);//先序遍历并且进行比较
int main()
{
int n,l,i,x;
while(scanf("%d",&n)&&n!=0)
{
scanf("%d",&l);
Bintree *bt1;
bt1=NULL;
for(i=0;i<n;i++)
{
scanf("%d",&x);
bt1=insert(bt1,x);
}
while(l--)
{
Bintree *bt2;
bt2=NULL;
for(i=0;i<n;i++)
{
scanf("%d",&x);
bt2=insert(bt2,x);
}
Flag=1;
printS(bt1,bt2);
(Flag)?printf("Yes\n"):printf("No\n");
}
}
return 0;
}
Bintree *insert(Bintree *bt,int x)
{
if(bt==NULL)
{
bt=(Bintree*)malloc(sizeof(Bintree));
bt->date=x;
bt->left=NULL;
bt->right=NULL;
return bt;
}
if(bt!=NULL)
{
if(x<(bt->date)) //二叉搜索树的特性,比它小放它左边,反之放右边
bt->left=insert(bt->left,x);
else
bt->right=insert(bt->right,x);
}
return bt;
}
void printS(Bintree *t1,Bintree *t2)
{
if(t1&&t2)
{
if(t1->date!=t2->date)//如果有出现不同 直接将全局变量变为0
Flag=0;
else //否则递归的遍历
{
printS(t1->left,t2->left);
printS(t1->right,t2->right);
}
}
}
测试点 | 提示 | 结果 | 分数 | 耗时 | 内存 |
---|---|---|---|---|---|
0 | sample 换顺序。有Yes,有No:根不同,子树根不同。树有单边、有双子树 | 答案正确 | 12 | 4 ms | 184 KB |
1 | 最大N,多组合 | 答案正确 | 8 | 4 ms | 336 KB |
2 | N=1,只有1个节点 | 答案正确 | 3 | 4 ms | 276 KB |
3 | 卡只判断数字相对先后位置的错误算法 | 答案正确 | 2 | 3 ms | 196 KB |