如何判断两棵二叉搜索树一致

代码的思想和图片参考:好大学慕课浙江大学陈越、何钦铭的《数据结构》

  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\n");
119             }else{
120                 printf("No\n");
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 }
判断两棵二叉搜索树是否一致

 

posted @ 2017-04-16 18:50  浪漫逆风  阅读(888)  评论(0编辑  收藏  举报