Time Limit: 400MS Memory Limit: 65536KB
Submit Statistic
Problem Description
对应给定的一个序列可以唯一确定一棵二叉排序树。然而,一棵给定的二叉排序树却可以由多种不同的序列得到。例如分别按照序列{3,1,4}和{3,4,1}插入初始为空的二叉排序树,都得到一样的结果。你的任务书对于输入的各种序列,判断它们是否能生成一样的二叉排序树。
Input
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (n < = 10)和L,分别是输入序列的元素个数和需要比较的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列生成一颗二叉排序树。随后L行,每行给出N个元素,属于L个需要检查的序列。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
Output
对每一组需要检查的序列,如果其生成的二叉排序树跟初始序列生成的二叉排序树一样,则输出"Yes",否则输出"No"。
Example Input
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
Example Output
Yes
No
No
Hint
Author
xam
二叉排序树: 或是一颗空树 或者具有以下性质:
1. 若它的左子树不空,则左子树上的所有结点的值均小于它的根节点的值
2. 若它的右子树不空,则右子树上的所有结点的值均大于它的根节点的值
3.它的左右子树都是二叉排序树
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *lc, *rc;
}*Tree;
struct node *creat(Tree T, int t)
{
if(T == NULL)
{
T =(Tree)malloc(sizeof(struct node));
T->data = t;
T->lc = T->rc = NULL;
}
else
{
if(t>T->data)
T->rc = creat(T->rc, t);
else
T->lc = creat(T->lc, t);
}
return T;
}
int judge(Tree T, Tree TT)
{
if(T==NULL&&TT==NULL)
return 1;
else if(T!= NULL&&TT!=NULL)
{
if(T->data != TT->data)
{
return 0;
}
else if(judge(T->lc, TT->lc)&&judge(T->rc, TT->rc))
return 1;
else
return 0;
}
else
return 0;
}
int main()
{
int n, l;
int i, j, t;
Tree T;
T = (Tree)malloc(sizeof(struct node));
T->lc = NULL;
T->rc = NULL;
while(~scanf("%d", &n))
{
if(n==0)
break;
scanf("%d", &l);
scanf("%d", &t);
T->data = t;
for(i = 2; i <= n; i++)
{
scanf("%d", &t);
T = creat(T, t);
}
while(l--)
{
Tree TT;
TT = (Tree)malloc(sizeof(struct node));
TT->lc = NULL;
TT->rc = NULL;
scanf("%d", &t);
TT->data = t;
for(j = 2; j <= n; j++)
{
scanf("%d", &t);
TT = creat(TT, t);
}
j = judge(T, TT);
if(j)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}
判断二叉树是否相等的顺序:
首先两个根节点都为空时 返回1
然后两个根节点都不为空时
判断根节点的数据是否相等
首先不相等时返回-1
否则相等 则继续判断两个根的左右孩子是否相等,全相等返回1
否则返回-1.
否则是一个为空一个不为空 返回-1