1 #include
2 #include "stdlib.h"
3 #include "io.h"
4 #include "math.h"
5 #include "time.h"
6
7 #define MAXSIZE 100
8 #define MAX_TREE_SIZE 100
9 typedef int Status; /*Status是函数的类型,其值是函数结果状态代码,如OK等*/
10 typedef int TElemType; /*树结点的数据类型,目前暂定为整型*/
11 typedef int SqBiTree[MAX_TREE_SIZE];/*0号单元存储根结点*/
12
13 typedef struct{14 /*结点的层,本层序号(按满二叉树计算)*/
15 intlevel,order;16 }Position;17
18 //假设整数0代表为空
19 int Nil = 0;20
21 //构造空的二叉树,因为T是固定数组,不会改变,故不需要&
22 Status InitBiTree(SqBiTree T){23 inti;24 for(i=0; i
26 }27 return 1;28 }29
30 //按层序次序输入二叉树的节点的值(字符型或整形),构造顺序存储二叉树
31 Status CreateBiTree(SqBiTree T){32 int i =0;33 printf("请按层序输入结点的值(整型),0表示空结点,输999结束。结点数≤%d:\n",MAX_TREE_SIZE);34 while(i<=10){35 T[i] = i+1;36 if(i!=0&&T[(i+1)/2-1] == Nil&&T[i]!=Nil){37 printf("出现了无双亲且非根节点%d\n",T[i]);38 exit(0);39 }40 i++;41 }42 //然后将后面的值赋值为空
43 while(i
50 //清空二叉树,在顺序存储中,两函数完全一样
51 #define ClearBiTree InitBiTree
52
53 /*初始条件: 二叉树T存在*/
54 /*操作结果: 若T为空二叉树,则返回TRUE,否则FALSE*/
55 Status BiTreeEmpty(SqBiTree T){56 if(T[0] ==Nil){57 return 1;58 }59 return 0;60 }61
62 /*初始条件: 二叉树T存在。操作结果: 返回T的深度*/
63 Status BiTreeDepth(SqBiTree T){64 //性质2:深度为k的二叉树至多有2^k个节点
65 int k = 0;66 while(powl(2,k)<=(10+1)){67 k++;68 }69 returnk;70 }71
72 /*初始条件: 二叉树T存在*/
73 /*操作结果: 当T不空,用e返回T的根,返回OK;否则返回ERROR,e无定义*/
74 Status Root(SqBiTree T){75 TElemType root;76 if(BiTreeEmpty(T)){77 return 0;78 }else{79 root = T[0];80 returnroot;81 }82 }83
84 /*初始条件: 二叉树T存在,e是T中某个结点(的位置)*/
85 /*操作结果: 返回处于位置e(层,本层序号)的结点的值*/
86 Status Value(SqBiTree T,Position e){87 if(e.order <= powl(2,e.level-1)) //不超过每层的节点数
88 return T[(int)powl(2,e.level-1)+e.order-2];89 else
90 return 0;91 }92
93 /*初始条件: 二叉树T存在,e是T中某个结点(的位置)*/
94 /*操作结果: 给处于位置e(层,本层序号)的结点赋新值value*/
95 Status Assign(SqBiTree T,Position e,TElemType value){96 int index = (int)powl(2,e.level-1)+e.order-2;97 //值不为空,且双亲节点不存在时
98 if(value!= Nil&&T[(index+1)/2-1]==Nil){99 return 0;100 }101 /*给双亲赋空值但有叶子*/
102 else if(value == Nil && (T[index*2+1]!=Nil || T[index*2+2]!=Nil)){103 return 0;104 }105 T[index] =value;106 return 1;107 }108
109 //求一个节点的双亲节点
110 TElemType Parent(SqBiTree T,Position e){111 int index = 0;112 index = (int)powl(2,e.level-1)+e.order-2;113 //为空树或者只有根节点
114 if(T[0] == Nil ||(T[2*index+1]==Nil || T[2*index+2]==Nil)){115 return 0;116 }else{117 if(index%2==0)118 return T[index/2-1];119 else
120 return T[index/2];121 }122 return 0;123 }124
125 //求一个节点的左孩子节点
126 TElemType LeftChild(SqBiTree T,Position e){127 int index = 0;128 index = (int)powl(2,e.level-1)+e.order-2;129 if(T[0] == Nil ||(T[2*index+1]==Nil || T[2*index+2]==Nil)){130 return 0;131 }else{132 return T[2*index+1];133 }134 }135
136 //求一个节点的右孩子节点
137 TElemType RightChild(SqBiTree T,Position e){138 int index = 0;139 index = (int)powl(2,e.level-1)+e.order-2;140 if(T[0] == Nil ||(T[2*index+1]==Nil || T[2*index+2]==Nil)){141 return 0;142 }else{143 return T[2*index+2];144 }145 }146
147
148 //求一个节点的左兄弟节点
149 TElemType LeftSibling(SqBiTree T,Position e){150 int index = 0;151 index = (int)powl(2,e.level-1)+e.order-2;152 if(T[0] == Nil ||(T[2*index+1]==Nil || T[2*index+2]==Nil)){153 return 0;154 }else{155 if(index%2==0)156 return T[index-1];157 else
158 return 0;159 }160 }161
162 //求一个节点的左兄弟节点
163 TElemType RightSibling(SqBiTree T,Position e){164 int index = 0;165 index = (int)powl(2,e.level-1)+e.order-2;166 if(T[0] == Nil ||(T[2*index+1]==Nil || T[2*index+2]==Nil)){167 return 0;168 }else{169 if(index%2==0){170 return 0;171 }172 else
173 return T[index+1];174 }175 }176 //遍历
177 //先序遍历的原则(递归):
178 void PreTraverse(SqBiTree T,intindex){179 printf("%d",T[index]);180 if(T[2*index+1]!=Nil){181 PreTraverse(T,2*index+1);182 }183 if(T[2*index+2]!=Nil){184 PreTraverse(T,2*index+2);185 }186 }187 voidPreOrderTraverse(SqBiTree T){188 if(!BiTreeEmpty(T)){189 PreTraverse(T,0);190 }191 printf("\n");192 }193
194 //中序遍历原则:
195 void InTraverse(SqBiTree T,intindex){196
197 if(T[2*index+1]!=Nil){198 InTraverse(T,2*index+1);199 }200 printf("%d",T[index]);201 if(T[2*index+2]!=Nil){202 InTraverse(T,2*index+2);203 }204 }205 voidInOrderTraverse(SqBiTree T){206 if(!BiTreeEmpty(T)){207 InTraverse(T,0);208 }209 printf("\n");210 }211
212 //后序遍历原则:
213 void PostTraverse(SqBiTree T,intindex){214
215 if(T[2*index+1]!=Nil){216 PostTraverse(T,2*index+1);217 }218 if(T[2*index+2]!=Nil){219 PostTraverse(T,2*index+2);220 }221 printf("%d",T[index]);222 }223 voidPostOrderTraverse(SqBiTree T){224 if(!BiTreeEmpty(T)){225 PostTraverse(T,0);226 }227 printf("\n");228 }229
230
231
232 intmain(){233
234 SqBiTree T;235 InitBiTree(T);236 //创建二叉树
237 CreateBiTree(T);238
239 //判断是否为空
240 printf("二叉树是否为空:%d\n",BiTreeEmpty(T));241
242 //清空二叉树后243 //判断是否为空
244 printf("二叉树是否为空:%d\n",ClearBiTree(T));245 //重新创建二叉树
246 CreateBiTree(T);247
248 //树的深度
249 printf("树的深度:%d\n",BiTreeDepth(T));250
251 //树根
252 printf("树的根节点:%d\n",Root(T));253
254 //寻找某一层某个特地的元素
255 Position e;256 e.level = 2;257 e.order = 2;258 printf("2层第2个是:%d\n",Value(T,e));259
260 //修改节点元素
261 Assign(T,e,50);262 printf("2层第2个是:%d\n",Value(T,e));263
264 //求节点双亲
265 printf("2层第2个的双亲是:%d\n",Parent(T,e));266
267 //求节点左孩子
268 printf("2层第2个的左孩子是:%d\n",LeftChild(T,e));269
270 //求节点右孩子
271 printf("2层第2个的左孩子是:%d\n",RightChild(T,e));272
273
274 //求节点左兄弟
275 printf("2层第2个的左兄弟是:%d\n",LeftSibling(T,e));276 //求节点右兄弟
277 printf("2层第2个的右兄弟是:%d\n",RightSibling(T,e));278
279
280 //先序遍历
281 printf("先序遍历\n");282 PreOrderTraverse(T);283
284 //中序遍历
285 printf("中序遍历\n");286 InOrderTraverse(T);287
288 //后序遍历
289 printf("后序遍历\n");290 PostOrderTraverse(T);291 return 0;292 }