Time Limit: 1 Sec Memory Limit: 32 MB
Submit: 15 Solved: 9
[Submit][Status][Web Board]Description
判断两序列是否为同一二叉搜索树序列
Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。Output
如果序列相同则输出YES,否则输出NO
Sample Input
6 45021 12045 54120 45021 45012 21054 50412 0
Sample Output
NO NO YES NO NO NO
learn from 博主链接传送门
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 1e4 + 5;
char a[maxn],a_tree[maxn];
char b[maxn],b_tree[maxn];
void create(char a[],char a_tree[],int lena)
{
int tmp;
a_tree[0] = a[0] ;
for(int i = 0 ; i < lena;i++)
{
tmp = 0;
while(a_tree[tmp] != '0')
{
if(a[i] < a_tree[tmp])
tmp = 2 * tmp + 1;
else
tmp = 2 * tmp + 2;
}
a_tree[tmp] = a[i];
}
}
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
if(n == 0)
break;
scanf("%s",a);//a: standard
int lena = strlen(a);
memset(a_tree,'0',sizeof(a_tree));
create(a,a_tree,lena);
for(int i = 0 ; i < n; i ++)
{
scanf("%s",b);
int lenb = strlen(b);
memset(b_tree,'0',sizeof(b_tree));
create(b,b_tree,lenb);
printf("%s\n",strcmp(a_tree,b_tree) == 0 ? "YES":"NO");
}
}
return 0;
}