|
32 | 32 | No
|
33 | 33 | */
|
34 | 34 |
|
| 35 | +//解本题用到的方法是先建立一棵树,然后依照这个树分别判别后面的L个序列能否与T形成同一个搜索树并输出结果 |
| 36 | +#include <stdio.h> |
| 37 | +#include <stdlib.h> |
| 38 | + |
| 39 | +typedef struct treenode *tree; |
| 40 | +struct treenode { |
| 41 | + int v; |
| 42 | + tree left, right; |
| 43 | + int flag; |
| 44 | +}; |
| 45 | + |
| 46 | +//创建一个新的结点 |
| 47 | +tree new_node(int v) { |
| 48 | + tree t = (tree) malloc(sizeof(struct treenode)); |
| 49 | + t->v = v; |
| 50 | + t->left = t->right = NULL; |
| 51 | + t->flag = 0; |
| 52 | + return t; |
| 53 | +} |
| 54 | + |
| 55 | +//向节点插入数据 |
| 56 | +tree insert_tree(tree t, int v) { |
| 57 | + if (!t) |
| 58 | + t = new_node(v); //如果是一棵空树,那么创建一个新节点作为树根 |
| 59 | + else { |
| 60 | + if (v > t->v) { |
| 61 | + t->right = insert_tree(t->right, v); |
| 62 | + } else { |
| 63 | + t->left = insert_tree(t->left, v); |
| 64 | + } |
| 65 | + } |
| 66 | + return t; |
| 67 | +} |
| 68 | + |
| 69 | +//创建一棵搜索树 |
| 70 | +tree make_tree(int n) { |
| 71 | + tree t; |
| 72 | + int i, v; |
| 73 | + |
| 74 | + scanf("%d", &v); |
| 75 | + |
| 76 | + t = new_node(v); |
| 77 | + for (i = 1; i < n; i++) { |
| 78 | + scanf("%d", &v); |
| 79 | + t = insert_tree(t, v); |
| 80 | + } |
| 81 | + return t; |
| 82 | +} |
| 83 | + |
| 84 | +//在树t中搜索整数v,看看v是否符合要求 |
| 85 | +int check(tree t, int v) { |
| 86 | + if (t->flag) { |
| 87 | + if (v < t->v) |
| 88 | + return check(t->left, v); |
| 89 | + else if (v > t->v) |
| 90 | + return check(t->right, v); |
| 91 | + } else { |
| 92 | + if (v == t->v) { |
| 93 | + t->flag = 1; |
| 94 | + return 1; |
| 95 | + } else { |
| 96 | + return 0; |
| 97 | + } |
| 98 | + |
| 99 | + } |
| 100 | +} |
| 101 | + |
| 102 | +//判断一组数据插入后是否和树t相同,返回1则相同,返回0则不相同 |
| 103 | +//判断flag的原因是,即使已经知道不一致了,但是如果不继续将后面的数据输入,会导致程序错误 |
| 104 | +int judge(tree t, int n) { |
| 105 | + int i, v, flag = 0; |
| 106 | + scanf("%d", &v); |
| 107 | + if (v != t->v) //如果树根不相等,直接返回0,即不同 |
| 108 | + flag = 1; |
| 109 | + else |
| 110 | + t->flag = 1; //这个节点比较过 |
| 111 | + |
| 112 | + for (i = 1; i < n; i++) { |
| 113 | + scanf("%d", &v); |
| 114 | + if ((!flag) && !check(t, v)) |
| 115 | + flag = 1; |
| 116 | + } |
| 117 | + |
| 118 | + if (flag) |
| 119 | + return 0; |
| 120 | + else |
| 121 | + return 1; |
| 122 | +} |
| 123 | + |
| 124 | +void reset_tree(tree t) { |
| 125 | + if (t->left) |
| 126 | + reset_tree(t->left); |
| 127 | + if (t->right) |
| 128 | + reset_tree(t->right); |
| 129 | + t->flag = 0; |
| 130 | +} |
| 131 | + |
| 132 | +void free_tree(tree t) { |
| 133 | + if (t->left) |
| 134 | + free_tree(t->left); |
| 135 | + if (t->right) |
| 136 | + free_tree(t->right); |
| 137 | + free(t); |
| 138 | +} |
| 139 | + |
| 140 | +/* |
| 141 | +读入 n 和 l |
| 142 | +根据第一行序列建立树T |
| 143 | +依据树T分别判断后面的L个序列是否能与T形成同一搜索树并输出结果 |
| 144 | +如何判别序列是否与树是一致的呢? |
| 145 | +方法:在树T中按顺序搜索序列中的每个数 |
| 146 | +- 如果每次搜索所经过的节点在前面均为出现过,则一致 |
| 147 | +- 否则,如果某次搜索中遇到前面未出现的节点,则不一致 |
| 148 | +*/ |
| 149 | +int main() { |
| 150 | + int n, l, i; |
| 151 | + tree t; |
| 152 | + |
| 153 | + scanf("%d", &n); //输入后面每个序列的节点数 |
| 154 | + |
| 155 | + while (n) { |
| 156 | + scanf("%d", &l); //获得后面有几组数据,然后分别判定每一组数据 |
| 157 | + t = make_tree(n); |
| 158 | + for (i = 0; i < l; i++) { |
| 159 | + if (judge(t, n)) { |
| 160 | + printf("Yes\n"); |
| 161 | + } else { |
| 162 | + printf("No\n"); |
| 163 | + } |
| 164 | + reset_tree(t); |
| 165 | + } |
| 166 | + free_tree(t); |
| 167 | + scanf("%d", &n); //读入下一个N也就是下一组数据的节点个数,开启下一个循环 |
| 168 | + } |
| 169 | + |
| 170 | + return 0; |
| 171 | +} |
| 172 | + |
35 | 173 |
|
36 | 174 |
|
37 | 175 |
|
0 commit comments