代码的思想和图片参考:好大学慕课浙江大学陈越、何钦铭的《数据结构》
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 5 6 /* 7 需求:比较是否为相同的二叉搜索树 8 我们知道的是:给定一个插入序列可以唯一的确定一棵二叉搜索树 9 但是对于相同的一个二叉搜索树,不一定有同一个插入序列 10 例如{2 3 1}和{2 1 3}就是相同的二叉搜索树 11 12 输入要求: 13 4 2 源二叉搜索树的节点个数N 有L个二叉搜索树需要和源二叉搜索进行比较 14 3 1 4 2 源二叉搜索树 15 3 4 1 2 需要进行比较的二叉搜索树 16 3 2 4 1 被比较的二叉搜索树 17 2 1 源二叉搜索树的节点个数 有几个二叉搜索树需要和源二叉搜索进行比较 18 2 1 源二叉搜索树 19 1 2 需要进行比较的二叉搜索树 20 0 程序结束的标志 21 22 输出 23 ### 输出样例: 24 Yes 25 No 26 No 27 28 算法思路 29 我们先使用源二叉树的节点建立一棵二叉搜索树 30 然后在源二叉树中国对每个目的二叉树的每个元素进行查找 31 32 如果每次搜索所经过的结点在前面均出现过,则一致 33 否则(某次搜索中遇到前面未出现的结点),则不一致 34 35 程序设计的思路: 36 int main(){ 37 读入N和L 38 建立源二叉树T 39 比较T是否和L个二叉树一致,并打印结果 40 return 0; 41 } 42 43 需要设计的主要函数 44 1.读数据建树T 45 2.判断一个序列是否和T构成相同的搜索树 46 */ 47 48 typedef int elementType; 49 50 /*define a binary tree*/ 51 typedef struct node{ 52 elementType element; 53 struct node *left; 54 struct node *right; 55 int flag;/*为了标记某个节点是以及被访问过 1表示以及被访问过了,0表示没有被访问过*/ 56 }tre,*pTree; 57 58 /*构造二叉搜索树 59 @param N 二叉搜索树节点的个数 60 @return 返回一个二叉搜索树的根节点 61 */ 62 pTree buildTree(int N); 63 64 /* 65 把一个节点插入二叉搜索树中 66 @param tree 已经存在的二叉搜索树 67 @param element 需要插入到二叉搜索树的元素 68 */ 69 pTree insert(pTree tree,elementType element); 70 71 /* 72 创建一个树的节点 73 @param element 需要创建树节点的元素值 74 */ 75 pTree newNode(int element); 76 77 /*对二叉树进行先序遍历 78 @param tree 需要进行先序遍历的二叉树 79 */ 80 void preOrderTraversal(pTree tree); 81 /* 82 判断一棵二叉树是否和源二叉树一致 83 @param tree 源二叉搜索树 84 @param N 二叉搜索树的节点个数 85 @return 如果相同 返回1,否则返回0 86 */ 87 int judge(pTree tree,int N); 88 89 /*把二叉搜索树的flag标志全部置0 90 @param tree 需要把flag全部置0的二叉搜索树 91 */ 92 void resetTree(pTree tree); 93 94 /* 95 检查该元素是否是按照源二叉树的顺序插入二叉树 96 在二叉树中搜索该元素,如果之前搜索到的元素flag都为1,当flag不为1时 97 正是element==tree->element.表示此节点为正确插入节点,否则就为错误插入节点 98 @param tree 源二叉搜索 99 @param element 需要检测的元素 100 @return 元素正确插入 返回1 否则返回0 101 */ 102 int check(pTree tree,elementType element); 103 104 /*释放tree 105 @param tree 需要被释放的tree 106 */ 107 void freeTree(pTree tree); 108 int main(){ 109 int N,L; 110 int i; 111 scanf("%d",&N); 112 while(N){ 113 scanf("%d",&L); 114 pTree tree = buildTree(N); 115 //preOrderTraversal(tree); 116 for(i=0;i<L;i++){ 117 if(judge(tree,N)){ 118 printf("Yes "); 119 }else{ 120 printf("No "); 121 } 122 resetTree(tree); 123 } 124 /*释放已经判断过得二叉搜索树*/ 125 freeTree(tree); 126 scanf("%d",&N); 127 } 128 return 0; 129 } 130 131 pTree newNode(int element){ 132 pTree tree = (pTree)malloc(sizeof(tre)); 133 tree->element = element; 134 tree->left=tree->right = NULL; 135 //设置初始的标记位都为0,没有被访问 136 tree->flag=0; 137 return tree; 138 } 139 140 pTree insert(pTree tree,elementType element){ 141 if(!tree){ 142 tree = newNode(element); 143 }else{/**/ 144 if(element<tree->element){ 145 tree ->left = insert(tree->left,element); 146 } 147 else if(element>tree->element){ 148 tree->right = insert(tree->right,element); 149 } 150 } 151 return tree; 152 } 153 154 155 pTree buildTree(int N){ 156 int ele,i; 157 pTree tree; 158 scanf("%d",&ele); 159 tree = newNode(ele); 160 for(i=1;i<N;i++){ 161 scanf("%d",&ele); 162 tree = insert(tree,ele); 163 } 164 return tree; 165 } 166 167 void preOrderTraversal(pTree tree){ 168 if(tree){ 169 printf("%d ",tree->element); 170 preOrderTraversal(tree->left); 171 preOrderTraversal(tree->right); 172 } 173 } 174 175 int check(pTree tree,elementType element){ 176 if(tree->flag){ 177 if(element<tree->element){ 178 check(tree->left,element); 179 }else if(element>tree->element){ 180 check(tree->right,element); 181 }else{ 182 return 0; 183 } 184 }else{ 185 if(tree->element==element){ 186 tree->flag=1; 187 return 1; 188 }else{ 189 return 0; 190 } 191 } 192 } 193 194 195 int judge(pTree tree,int N){ 196 int elemen,i,flag=0; 197 scanf("%d",&elemen); 198 if(elemen!=tree->element){ 199 flag=1; 200 }else{ 201 tree->flag=1; 202 } 203 for(i=1;i<N;i++){ 204 scanf("%d",&elemen); 205 /*当已经判断出该二叉搜索树和源二叉搜索树不一致时,需要继续把数据读完,不然未读完的数据就会变成下一个树的元素*/ 206 if((!flag) && (!check(tree,elemen))){ 207 flag=1; 208 } 209 } 210 if(flag){ 211 return 0; 212 }else{ 213 return 1; 214 } 215 216 } 217 218 void resetTree(pTree tree){ 219 if(tree->left){ 220 resetTree(tree->left); 221 } 222 if(tree->right){ 223 resetTree(tree->right); 224 } 225 tree->flag=0; 226 } 227 228 void freeTree(pTree tree){ 229 if(tree->left){ 230 freeTree(tree->left); 231 } 232 if(tree->right){ 233 free(tree->right); 234 } 235 free(tree); 236 }