题目描述
判断两序列是否为同一二叉搜索树序列
输入描述:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出描述:
如果序列相同则输出YES,否则输出NO
示例1
输入
2 567432 543267 576342 0
输出
YES NO
根据输入的两组序列,分别构造二叉排序树,只需要比较两个二叉排序树的前序遍历是否相同就能判断这两个序列是否能组成同一棵二叉排序树。因为如果两个二叉排序树前序序列相同,中序序列自然相同。如果中序序列不相同,说明一个序列里存在一些数字,这些数字不为这两个序列所共有,前序序列肯定不同。
因此,仅比较前序序列即可。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *lchild,*rchild;
} Node,*BiTree;
char str1[30],str2[30];
char *str;
int size0 = 0;
BiTree Build(BiTree T,int x)
{
if(T == NULL)
{
T = new Node();
T -> data = x;
return T;
}
else
{
if(x < T -> data)
{
T -> lchild = Build(T -> lchild,x);
}
else if(x > T -> data)
{
T -> rchild = Build(T -> rchild,x);
}
return T;
}
}
void PreOrder(BiTree T)
{
if(T)
{
str[(size0)++] = T -> data + '0';
PreOrder(T -> lchild);
PreOrder(T -> rchild);
}
}
int main()
{
char tmp[12];
int len;
int n;
while(scanf("%d",&n) != EOF && n != 0)
{
scanf("%s",tmp);
len = strlen(tmp) - 1;
BiTree T1 = NULL;
for(int i = 0; i <= len; i++)
{
T1 = Build(T1,tmp[i] - 48);
}
size0 = 0;
str = str1;
PreOrder(T1);
str1[size0] = 0;
while(n > 0)
{
scanf("%s",tmp);
len = strlen(tmp) - 1;
BiTree T2 = NULL;
for(int i = 0; i <= len; i++)
{
T2 = Build(T2,tmp[i] - 48);
}
size0 = 0;
str = str2;
PreOrder(T2);
str2[size0] = 0;
puts(strcmp(str1,str2) == 0 ? "YES":"NO");
n--;
}
}
return 0;
}