码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树的链式结构

时间:2015-07-09 00:19:50      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

  1. #include "string.h"
  2. #include "stdio.h"
  3. #include "stdlib.h"
  4. #include "io.h"
  5. #include "math.h"
  6. #include "time.h"
  7. #define OK 1
  8. #define ERROR 0
  9. #define TRUE 1
  10. #define FALSE 0
  11. #define MAXSIZE 100 /* 存储空间初始分配量 */
  12. typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
  13. /* 用于构造二叉树********************************** */
  14. int index = 1;
  15. typedef char String[24]; /* 0号单元存放串的长度 */
  16. String str;
  17. Status StrAssign(String T, char *chars)
  18. {
  19. int i;
  20. if (strlen(chars)>MAXSIZE)
  21. return ERROR;
  22. else
  23. {
  24. T[0] = strlen(chars);
  25. for (i = 1; i <= T[0]; i++)
  26. T[i] = *(chars + i - 1);
  27. return OK;
  28. }
  29. }
  30. /* ************************************************ */
  31. typedef char TElemType;
  32. TElemType Nil = ‘ ‘; /* 字符型以空格符为空 */
  33. Status visit(TElemType e)
  34. {
  35. printf("%c ", e);
  36. return OK;
  37. }
  38. typedef struct BiTNode /* 结点结构 */
  39. {
  40. TElemType data; /* 结点数据 */
  41. struct BiTNode *lchild, *rchild; /* 左右孩子指针 */
  42. }BiTNode, *BiTree;
  43. /* 构造空二叉树T */
  44. Status InitBiTree(BiTree *T)
  45. {
  46. *T = NULL;
  47. return OK;
  48. }
  49. /* 初始条件: 二叉树T存在。操作结果: 销毁二叉树T */
  50. void DestroyBiTree(BiTree *T)
  51. {
  52. if (*T)
  53. {
  54. if ((*T)->lchild) /* 有左孩子 */
  55. DestroyBiTree(&(*T)->lchild); /* 销毁左孩子子树 */
  56. if ((*T)->rchild) /* 有右孩子 */
  57. DestroyBiTree(&(*T)->rchild); /* 销毁右孩子子树 */
  58. free(*T); /* 释放根结点 */
  59. *T = NULL; /* 空指针赋0 */
  60. }
  61. }
  62. /* 按前序输入二叉树中结点的值(一个字符) */
  63. /* #表示空树,构造二叉链表表示二叉树T。 */
  64. void CreateBiTree(BiTree *T)
  65. {
  66. TElemType ch;
  67. /* scanf("%c",&ch); */
  68. ch = str[index++];
  69. if (ch == ‘#‘)
  70. *T = NULL;
  71. else
  72. {
  73. *T = (BiTree)malloc(sizeof(BiTNode));
  74. if (!*T)
  75. exit(OVERFLOW);
  76. (*T)->data = ch; /* 生成根结点 */
  77. CreateBiTree(&(*T)->lchild); /* 构造左子树 */
  78. CreateBiTree(&(*T)->rchild); /* 构造右子树 */
  79. }
  80. }
  81. /* 初始条件: 二叉树T存在 */
  82. /* 操作结果: 若T为空二叉树,则返回TRUE,否则FALSE */
  83. Status BiTreeEmpty(BiTree T)
  84. {
  85. if (T)
  86. return FALSE;
  87. else
  88. return TRUE;
  89. }
  90. #define ClearBiTree DestroyBiTree
  91. /* 初始条件: 二叉树T存在。操作结果: 返回T的深度 */
  92. int BiTreeDepth(BiTree T)
  93. {
  94. int i, j;
  95. if (!T)
  96. return 0;
  97. if (T->lchild)
  98. i = BiTreeDepth(T->lchild);
  99. else
  100. i = 0;
  101. if (T->rchild)
  102. j = BiTreeDepth(T->rchild);
  103. else
  104. j = 0;
  105. return i>j ? i + 1 : j + 1;
  106. }
  107. /* 初始条件: 二叉树T存在。操作结果: 返回T的根 */
  108. TElemType Root(BiTree T)
  109. {
  110. if (BiTreeEmpty(T))
  111. return Nil;
  112. else
  113. return T->data;
  114. }
  115. /* 初始条件: 二叉树T存在,p指向T中某个结点 */
  116. /* 操作结果: 返回p所指结点的值 */
  117. TElemType Value(BiTree p)
  118. {
  119. return p->data;
  120. }
  121. /* 给p所指结点赋值为value */
  122. void Assign(BiTree p, TElemType value)
  123. {
  124. p->data = value;
  125. }
  126. /* 初始条件: 二叉树T存在 */
  127. /* 操作结果: 前序递归遍历T */
  128. void PreOrderTraverse(BiTree T)
  129. {
  130. if (T == NULL)
  131. return;
  132. printf("%c", T->data);/* 显示结点数据,可以更改为其它对结点操作 */
  133. PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */
  134. PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */
  135. }
  136. /* 初始条件: 二叉树T存在 */
  137. /* 操作结果: 中序递归遍历T */
  138. void InOrderTraverse(BiTree T)
  139. {
  140. if (T == NULL)
  141. return;
  142. InOrderTraverse(T->lchild); /* 中序遍历左子树 */
  143. printf("%c", T->data);/* 显示结点数据,可以更改为其它对结点操作 */
  144. InOrderTraverse(T->rchild); /* 最后中序遍历右子树 */
  145. }
  146. /* 初始条件: 二叉树T存在 */
  147. /* 操作结果: 后序递归遍历T */
  148. void PostOrderTraverse(BiTree T)
  149. {
  150. if (T == NULL)
  151. return;
  152. PostOrderTraverse(T->lchild); /* 先后序遍历左子树 */
  153. PostOrderTraverse(T->rchild); /* 再后序遍历右子树 */
  154. printf("%c", T->data);/* 显示结点数据,可以更改为其它对结点操作 */
  155. }
  156. int main()
  157. {
  158. int i;
  159. BiTree T;
  160. TElemType e1;
  161. InitBiTree(&T);
  162. StrAssign(str, "ABDH#K###E##CFI###G#J##");
  163. CreateBiTree(&T);
  164. printf("构造空二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n", BiTreeEmpty(T), BiTreeDepth(T));
  165. e1 = Root(T);
  166. printf("二叉树的根为: %c\n", e1);
  167. printf("\n前序遍历二叉树:");
  168. PreOrderTraverse(T);
  169. printf("\n中序遍历二叉树:");
  170. InOrderTraverse(T);
  171. printf("\n后序遍历二叉树:");
  172. PostOrderTraverse(T);
  173. ClearBiTree(&T);
  174. printf("\n清除二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n", BiTreeEmpty(T), BiTreeDepth(T));
  175. i = Root(T);
  176. if (!i)
  177. printf("树空,无根\n");
  178. return 0;
  179. }





二叉树的链式结构

标签:

原文地址:http://www.cnblogs.com/zhuzhenfeng/p/4631659.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!