• 二叉树的链式结构


    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 ", BiTreeEmpty(T), BiTreeDepth(T));
    165. e1 = Root(T);
    166. printf("二叉树的根为: %c ", e1);
    167. printf(" 前序遍历二叉树:");
    168. PreOrderTraverse(T);
    169. printf(" 中序遍历二叉树:");
    170. InOrderTraverse(T);
    171. printf(" 后序遍历二叉树:");
    172. PostOrderTraverse(T);
    173. ClearBiTree(&T);
    174. printf(" 清除二叉树后,树空否?%d(1:是 0:否) 树的深度=%d ", BiTreeEmpty(T), BiTreeDepth(T));
    175. i = Root(T);
    176. if (!i)
    177. printf("树空,无根 ");
    178. return 0;
    179. }





  • 相关阅读:
    window 操作
    idea使用
    安装zookeeper
    resource和autowired
    python浅见 (Python 3000)
    Tomcat服务器
    servlet
    事件是一种委托吗?什么是委托?什么是事件?
    int值类型的ToString()方法是否装箱
    抽象类,虚方法与普通类的区别
  • 原文地址:https://www.cnblogs.com/zhuzhenfeng/p/4631659.html
Copyright © 2020-2023  润新知