九度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了,代码如下:
 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <string>
 5 
 6 /*
 7         0
 8        1 2
 9       3 4 5 6
10      7 8 9 10 11 12 13 14
11 
12  */
13 void buildTree(int n,int num[],int tree[],int left[],int right[]) {
14     for(int i = 0; i < 10; i++) {
15         tree[i] = -1;
16         left[i] = -1;
17         right[i] = -1;
18     }
19     int top = num[0];
20     tree[top] = 0;
21     for(int i = 1; i < n; i++) {
22         top = num[0];
23         int address = 0;
24         while(true) {
25             if(num[i] < top) {
26                 address = 2 * address + 1;
27                 if(left[top] == -1) {
28                     left[top] = num[i];
29                     tree[num[i]] = address;
30                     break;
31                 }
32                 else {
33                     top = left[top];
34                 }
35             }
36             else if(num[i] > top) {
37                 address = 2 * address + 2;
38                 if(right[top] == -1) {
39                     right[top] = num[i];
40                     tree[num[i]] = address;
41                     break;
42                 }
43                 else {
44                     top = right[top];
45                 }
46             }
47         }//while
48         
49     }
50 }
51 
52 char s[20];
53 int main(int argc, char const *argv[])
54 {
55     int n;
56     int len;
57     scanf("%d",&n);
58     while(n != 0) {
59         int num[12];//source
60         int tree[12];//every num's address
61         int left[12];//every num's nextLeft's value
62         int right[12];//every num's nextRight's value
63         scanf("%s",s);
64         for(int i = 0; i < strlen(s); i++) {
65             num[i] = s[i] - '0';
66         }
67         buildTree(strlen(s),num,tree,left,right);
68         len = strlen(s);
69         for(int i = 0; i < n; i++) {
70             scanf("%s",s);
71             int numt[12];//source
72             int treet[12];//every num's address
73             int leftt[12];//every num's nextLeft's value
74             int rightt[12];//every num's nextRight's value
75             for(int i = 0; i < strlen(s); i++) {
76                 numt[i] = s[i] - '0';
77             }
78             buildTree(strlen(s),numt,treet,leftt,rightt);
79             bool flag = true;
80             if(strlen(s) != len) {
81                 flag = false;
82             }
83             for(int i = 0; i < strlen(s) && flag == true; i++) {
84                 if(treet[numt[i]] != tree[numt[i]]) {
85                     flag = false;
86                     break;
87                 }
88             }
89             if(flag == false) {
90                 printf("%s
","NO");
91             }
92             else {
93                 printf("%s
","YES");
94             }
95         }
96         scanf("%d",&n);
97     }
98     return 0;
99 }

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

原文地址:https://www.cnblogs.com/jasonJie/p/5669167.html