4934: 二叉搜索树
Time Limit: 1 Sec Memory Limit: 32 MB
Submit: 10 Solved: 5
[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
HINT
Source
解题思路:这题是用数组来做的,因为考虑到数据比较小,就不要正经地建树,直接用下标来存储,create函数中就是稍微将他们的顺序存一下相应的结点值,如果比根节点小,就往左边,就是2*index+1,否则就往右边走,就是2*index+2,每一个序列都这样做一下,然后看和第一个是不是相同的,相同就输出YES否则输出NO,具体的还是看代码比较清楚
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
char l[maxn];
char lr[maxn];
void create(char l[],char lr[],int len)
{
int index;
lr[0]=l[0];
for(int i=0;i<len;i++)
{
index=0;
while(lr[index]!='0')
{
if(l[i]<lr[index]) index=2*index+1;
else index=2*index+2;
}
lr[index]=l[i];
}
}
int main(void)
{
int n;
while(~scanf("%d",&n)&&n)
{
scanf("%s",l);
int len=strlen(l);
fill(lr,lr+maxn,'0');
create(l,lr,len);
for(int i=0;i<n;i++)
{
char l1[maxn];
char lr1[maxn];
scanf("%s",l1);
int len1=strlen(l1);
fill(lr1,lr1+maxn,'0');
create(l1,lr1,len1);
printf("%s\n",strcmp(lr,lr1)==0?"YES":"NO");
}
}
return 0;
}