二叉树的链式结构

  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. }

来自为知笔记(Wiz)

时间: 2024-10-13 16:22:30

二叉树的链式结构的相关文章

二叉树的链式存储结构--二叉链表

1 二叉树的链式存储结构 //二叉链表的结点结构定义 typedef struct BiTNode { int data; struct BiTNode *lchild; struct BiTNode *rchild; }BiTNode; typedef struct BiTNode *BiTree; 结构示意图如下: 2 二叉树的遍历方法 (1)前序遍历:先访问根结,然后前序遍历左子树,再前序遍历右子树. (2)

二叉树顺序结构实现/链式结构实现

程杰<大话数据结构>这部分的源码乱起八糟的.自己总结下: 顺序结构: #include "stdafx.h" #include "string.h" #include "stdio.h" #include "stdlib.h" #include <iostream> using namespace std; #define ok 1 #define error 0 #define true 1 #def

数据结构:二叉树的链式存储

数据结构:二叉树的链式存储(C语言版) 1.写在前面 二叉树同样有两种存储方式,数组和链式存储,对于数组来说,我们利用二叉树的性质然后利用下标可以方便的找到一个节点的子节点和父节点. 二叉树的性质: 1.二叉树的第i层上至多有2i-1个节点 2.深度为K的二叉树至多有2k-1个节点 3.任何一个二叉树中度数为2的节点的个数必度数为0的节点数目少1. 说明:度数为0,为叶子节点. 4.具有n个节点的完全二叉树的深度为|_Log2N_|+1 5.若完全二叉树中的某节点编号为i,则若有左孩子编号为2i

不要打断链式结构:使用 RxJava的 compose() 操作符

不要打断链式结构:使用 RxJava的 compose() 操作符

文件上传以及JS链式结构

文件上传: 文件上传使用FileUpload控件,使用控件的SaveAs方法,需要绝对路径. 获取文件的绝对路径:Server.MapPath(相对路径); 或许要上传文件的本身名字用.FileName获取. 因为名字相同的文件将会被直接覆盖,所以一般文件名字要拼接上传时间和用户名保证不重名. 上传文件默认最大为4MB,在C#端限制文件大小有缺陷,一般用JS端限制. 获取要上传的文件通过ID获取FileUpload控件然后通过value值获取文件然后通过.length属性确定是否有文件要上传,然

栈的链式结构表示与实现——自己写数据结构

今天给大家介绍栈的链式结构,用dev-c++4.9.9.2调试通过,少废话直接上代码: 数据结构体存放文件stacklist.h文件如下 #ifndef _STACKLIST_H_ #define _STACKLIST_H_ typedef struct _Node { int data; struct _Node *pre; struct _Node *next; }Node,*pNode; typedef struct _Stack_Header { struct _Node *botton

链式结构实现堆排序

在很多数据结构和算法的书上,"堆排序"的实现都是建立在数组上,数组能够通过下标访问其元素,其这一特性在堆排序的实现上,使得其编码实现比链式结构简单,下面我利用链表实现堆排序. 在"堆"这种数据结构中,分为"大根堆"和"小根堆","大根堆"中其每一个双亲节点大于等于其子女节点,"小根堆"的定义与其相 反, 当然实现最大堆之前必须要建一个堆,一个高度为h的堆,它的前h-1层时满的,如下图所示

01-用链式结构打印学生成绩单

用链式结构打印学生成绩单 #include <iostream> using namespace std; struct StScore { std::string id; int math; int english; int computer; struct StScore* next; }; int main() { StScore first; first.id = "C"; first.math = 80; first.english = 85; first.com

数据结构-线性表的链式结构

线性表的链式结构,与之前说过的线性表的顺序结构差不多,区别在于存储结构和方式的不一样. 在链式中,来一个数据就去寻找一个空间存储一个结点有多少数据占多大的地方,是动态的存储方式.另外顺序表如果存储1MB就只占1MB存储空间,但是链式表不一样,它会有额外的空间去存储对应结点的指针. 这样一分析结构就出来了,链式结构为两部分:1.结点域.2.指针域.实现方法用动态存储. 1 #include "stdio.h" 2 #include "stdlib.h" 3 4 typ