二叉搜索树
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5130 Accepted Submission(s): 2295
Problem Description
判断两序列是否为同一二叉搜索树序列
Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
Output
如果序列相同则输出YES,否则输出NO
Sample Input
2 567432 543267 576342 0
Sample Output
YES NO
Source
Recommend
notonlysuccess | We have carefully selected several similar problems for you:
3787
3790
3789
3788
1710
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s[1000];
int t1[1000],t2[1000];
void Insert(char w,int *t)
{
int pos=1;
int c=w-'0';
while(t[pos]!=-1)
{
if(t[pos]<c) //存入右孩子
pos=2*pos+1;
else
pos=2*pos; //存入左孩子
}
t[pos]=c;
}
void build(char *str,int *t){ //树层次存入数组中
t[1]=str[0]-'0';
for(int i=1;s[i];i++)
Insert(s[i],t);
}
int main(){
int n,i;
while(scanf("%d",&n)!=EOF&&n)
{
memset(t1,-1,sizeof(t1));
scanf("%s",s);
build(s,t1); //原有序列
while(n--)
{
int flag=1;
memset(t2,-1,sizeof(t2));
scanf("%s",s);
build(s,t2); //输入序列
for(i=0;i<100;i++){
if(t1[i]!=t2[i])
break;
}
if(i==100)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}