九度oj题目1009:二叉搜索树

时间:2023-03-08 17:02:29
九度oj题目1009:二叉搜索树

题目描述:

判断两序列是否为同一二叉搜索树序列
输入:                       
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出:                       

如果序列相同则输出YES,否则输出NO

样例输入:                       
2
567432
543267
576342
0
样例输出:                       
YES
NO
在九度oj上Pending了两天,今天终于能用了,终于一次就AC了,代码如下:
 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string> /*
0
1 2
3 4 5 6
7 8 9 10 11 12 13 14 */
void buildTree(int n,int num[],int tree[],int left[],int right[]) {
for(int i = ; i < ; i++) {
tree[i] = -;
left[i] = -;
right[i] = -;
}
int top = num[];
tree[top] = ;
for(int i = ; i < n; i++) {
top = num[];
int address = ;
while(true) {
if(num[i] < top) {
address = * address + ;
if(left[top] == -) {
left[top] = num[i];
tree[num[i]] = address;
break;
}
else {
top = left[top];
}
}
else if(num[i] > top) {
address = * address + ;
if(right[top] == -) {
right[top] = num[i];
tree[num[i]] = address;
break;
}
else {
top = right[top];
}
}
}//while }
} char s[];
int main(int argc, char const *argv[])
{
int n;
int len;
scanf("%d",&n);
while(n != ) {
int num[];//source
int tree[];//every num's address
int left[];//every num's nextLeft's value
int right[];//every num's nextRight's value
scanf("%s",s);
for(int i = ; i < strlen(s); i++) {
num[i] = s[i] - '';
}
buildTree(strlen(s),num,tree,left,right);
len = strlen(s);
for(int i = ; i < n; i++) {
scanf("%s",s);
int numt[];//source
int treet[];//every num's address
int leftt[];//every num's nextLeft's value
int rightt[];//every num's nextRight's value
for(int i = ; i < strlen(s); i++) {
numt[i] = s[i] - '';
}
buildTree(strlen(s),numt,treet,leftt,rightt);
bool flag = true;
if(strlen(s) != len) {
flag = false;
}
for(int i = ; i < strlen(s) && flag == true; i++) {
if(treet[numt[i]] != tree[numt[i]]) {
flag = false;
break;
}
}
if(flag == false) {
printf("%s\n","NO");
}
else {
printf("%s\n","YES");
}
}
scanf("%d",&n);
}
return ;
}

这道题的思路是用数组记录建好树后每一个数字的位置,通过比较位置信息来判断是不是同一棵树