当前位置:   article > 正文

二叉树(C语言实现)——链式存储结构_二叉树的链式存储结构 c语言

二叉树的链式存储结构 c语言
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<stdbool.h>
  4. #define QueueSize 200
  5. typedef char DataType;
  6. typedef struct TNode
  7. {
  8. DataType data;
  9. struct TNode* lchild;
  10. struct TNode* rchild;
  11. }BiTree;
  12. BiTree* Creat_Tree(); // 创建树
  13. DataType Get_Root(BiTree * root); // 返回根结点
  14. int Depth_BiTree(BiTree * root); // 树深度
  15. int Count_BiTree(BiTree * root); // 树结点数
  16. int LeafCount_BiTree(BiTree * root); // 树叶子结点数
  17. void PreOrder_Traverse(BiTree * root); // 前序遍历
  18. void InOrder_Traverse(BiTree * root); // 中序遍历
  19. void PostOrder_Traverse(BiTree * root); // 后序遍历
  20. void LevelOrder_Traverse(BiTree * root); // 层序遍历
  21. bool Destroy_Tree(BiTree * root); // 销毁树
  22. int main()
  23. {
  24. BiTree * root = Creat_Tree();
  25. printf("根结点:%c\n",Get_Root(root));
  26. printf("树深度:%d\n",Depth_BiTree(root));
  27. printf("树结点数:%d\n",Count_BiTree(root));
  28. printf("树叶子结点数:%d\n",LeafCount_BiTree(root));
  29. printf("先序遍历:");
  30. PreOrder_Traverse(root);
  31. printf("\n");
  32. printf("中序遍历:");
  33. InOrder_Traverse(root);
  34. printf("\n");
  35. printf("后序遍历:");
  36. PostOrder_Traverse(root);
  37. printf("\n");
  38. printf("层序遍历:");
  39. LevelOrder_Traverse(root);
  40. printf("\n");
  41. if(Destroy_Tree(root))
  42. printf("销毁成功!\n");
  43. else
  44. printf("销毁失败!\n");
  45. return 0;
  46. }
  47. BiTree* Creat_Tree()
  48. {
  49. // 创建结点
  50. BiTree * pA = (BiTree*)malloc(sizeof(BiTree));
  51. BiTree * pB = (BiTree*)malloc(sizeof(BiTree));
  52. BiTree * pC = (BiTree*)malloc(sizeof(BiTree));
  53. BiTree * pD = (BiTree*)malloc(sizeof(BiTree));
  54. BiTree * pE = (BiTree*)malloc(sizeof(BiTree));
  55. // 给结点赋值
  56. pA->data = 'A';
  57. pB->data = 'B';
  58. pC->data = 'C';
  59. pD->data = 'D';
  60. pE->data = 'E';
  61. // 构建左右子树
  62. pA->lchild = pB;
  63. pA->rchild = pC;
  64. pB->lchild = pD;
  65. pB->rchild = NULL;
  66. pC->lchild = NULL;
  67. pC->rchild = pE;
  68. pD->lchild = NULL;
  69. pD->rchild = NULL;
  70. pE->lchild = NULL;
  71. pE->rchild = NULL;
  72. return pA; // 返回根结点的地址
  73. }
  74. DataType Get_Root(BiTree * root)
  75. {
  76. return root->data;
  77. }
  78. int Depth_BiTree(BiTree * root)
  79. {
  80. if(!root)
  81. return 0;
  82. return Depth_BiTree(root->lchild) > Depth_BiTree(root->rchild) ? Depth_BiTree(root->lchild)+1 : Depth_BiTree(root->rchild)+1;
  83. // 深度:最大层数 + 1
  84. }
  85. int Count_BiTree(BiTree * root)
  86. {
  87. if(!root)
  88. return 0;
  89. return Count_BiTree(root->lchild) + Count_BiTree(root->rchild) + 1;// 树结点数:左子树结点 + 右子树结点+ 根结点
  90. }
  91. int LeafCount_BiTree(BiTree * root)
  92. {
  93. if(!root)
  94. return 0;
  95. if(!root->lchild && !root->rchild) // 左、右指针域均为空,为叶子结点
  96. return 1;
  97. else
  98. return LeafCount_BiTree(root->lchild) + LeafCount_BiTree(root->rchild); // 递归遍历左、右子树叶子结点
  99. }
  100. /*
  101. * 伪算法:
  102. * 先访问根节点
  103. * 再先序访问左子树
  104. * 再线序访问右子树
  105. */
  106. void PreOrder_Traverse(BiTree * root)
  107. {
  108. if(!root)
  109. return;
  110. else
  111. {
  112. printf("%2c", root->data);
  113. PreOrder_Traverse(root->lchild);
  114. PreOrder_Traverse(root->rchild);
  115. }
  116. }
  117. void InOrder_Traverse(BiTree * root)
  118. {
  119. if(!root)
  120. return;
  121. else
  122. {
  123. InOrder_Traverse(root->lchild);
  124. printf("%2c", root->data);
  125. InOrder_Traverse(root->rchild);
  126. }
  127. }
  128. void PostOrder_Traverse(BiTree * root)
  129. {
  130. if(!root)
  131. return;
  132. else
  133. {
  134. PostOrder_Traverse(root->lchild);
  135. PostOrder_Traverse(root->rchild);
  136. printf("%2c", root->data);
  137. }
  138. }
  139. void LevelOrder_Traverse(BiTree * root)
  140. {
  141. // 建一个队列并初始化队头、队尾指针
  142. BiTree* Queue[QueueSize];
  143. int front = 0;
  144. int rear = 0;
  145. // 如果根结点不为空,则将根结点入队
  146. if(root!=NULL)
  147. Queue[rear++] = root;
  148. while(front!=rear) // 队列不为空
  149. {
  150. BiTree * ch = Queue[front++];
  151. printf("%2c", ch->data);
  152. // 将原结点的左、右子树结点入队
  153. if(ch->lchild!=NULL)
  154. Queue[rear++] = ch->lchild;
  155. if(ch->rchild!=NULL)
  156. Queue[rear++] = ch->rchild;
  157. }
  158. }
  159. bool Destroy_Tree(BiTree * root)
  160. {
  161. if(!root)
  162. return false;
  163. Destroy_Tree(root->lchild); // 先销毁左子树
  164. Destroy_Tree(root->rchild); // 再销毁右子树
  165. free(root); // 释放根结点
  166. root = NULL; // 防止产生野指针
  167. return true;
  168. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/727099
推荐阅读
相关标签
  

闽ICP备14008679号