二叉搜索树
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uDescription
判断两序列是否为同一二叉搜索树序列
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
一.题意分析
没啥说的
二.思路分析
写两个函数,一个插入字符,另一个操作字符串.
注意tree数组不能开太小,会Runtime Error (ACCESS_VIOLATION)
三.代码#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
using namespace std;
int tree1[1000], tree2[1000];
char num[11];
void insert(char word, int *tree)
{
int now = 1;
int t = word-'0';
while(tree[now]!=-1)
{
if(t>tree[now])
now = now*2+1;
else
now=now*2;
}
tree[now] = t;
}
void build(char *str, int *tree)
{
int len = strlen(str);
tree[1] = str[0] - '0';
int i = 1;
for(i=1; i<len; i++)
insert(str[i],tree);
}
int main()
{
int n;
char str[11];
while(scanf("%d", &n) && n)
{
memset(tree1,-1,sizeof(tree1));
memset(tree2,-1,sizeof(tree2));
scanf("%s", str);
build(str,tree1);
while(n--)
{
memset(tree2,-1,sizeof(tree2));
scanf("%s", str);
build(str,tree2);
int j;
for(j=0; j<1000; j++)
{
if(tree1[j]!=tree2[j])
break;
}
if(j==1000)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}
/*
2
567432
543267
576342
0
*/