题目1009:二叉搜索树
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:9363
解决:4116
-
题目描述:
-
判断两序列是否为同一二叉搜索树序列
-
输入:
-
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
-
输出:
-
如果序列相同则输出YES,否则输出NO
-
样例输入:
-
2 567432 543267 576342 0
-
样例输出:
-
YES NO
-
来源:
这道题的关键在于:得是前序和中序都相同才能判断为同一个二叉树。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Node{
Node *rchild;
Node *lchild;
int data;
};
Node *insert(Node *bt,int x)
{
if(bt==NULL)
{
bt= new Node;
bt->data=x;
bt->lchild=bt->rchild=NULL;
}
else if(x<bt->data)
{
bt->lchild=insert(bt->lchild,x);
}else if(x>bt->data)
{
bt->rchild=insert(bt->rchild,x);
}
return bt;
}
char ans1[10],ans2[10],ans3[10],ans4[10];
int cnt;
void preorder(Node *bt,char ans1[])
{
ans1[cnt++]=bt->data;
if(bt->lchild!=NULL)
preorder(bt->lchild,ans1);
if(bt->rchild!=NULL)
preorder(bt->rchild,ans1);
}
void inorder(Node *bt,char ans1[])
{
if(bt->lchild!=NULL)
preorder(bt->lchild,ans1);
ans1[cnt++]=bt->data;
if(bt->rchild!=NULL)
preorder(bt->rchild,ans1);
}
int main()
{
char str1[10],str2[10];
int n;
while(scanf("%d",&n)!=EOF){
if(n==0)break;
scanf("%s",str1);
int len1=strlen(str1);
Node *bt=NULL;
for(int i=0;i<len1;i++)
{
bt=insert(bt,str1[i]-'0');
}
cnt=0;
preorder(bt,ans1);
inorder(bt,ans2);
while(n--){
memset(ans2,0,sizeof(ans2));
memset(str2,0,sizeof(str2));
scanf("%s",str2);
int len2=strlen(str2);
Node *pt=NULL;
for(int i=0;i<len1;i++)
{
pt=insert(pt,str2[i]-'0');
}
cnt=0;
preorder(pt,ans3);
inorder(pt,ans4);
if(strcmp(ans1,ans3)==0&&strcmp(ans2,ans4)==0)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}