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