Data Structure - Binary Tree (C)

向右看齐 2023-01-22 15:59 290阅读 0赞

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net

  1. /*
  2. * Fatal.h - by FreeMan
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #define Error( Str ) FatalError( Str )
  7. #define FatalError( Str ) fprintf( stderr, "%s\n", Str ), exit( 1 )
  8. /*
  9. * BinaryTree.h - by FreeMan
  10. */
  11. typedef int ElementType;
  12. #ifndef _BinaryTree_H_
  13. #define _BinaryTree_H_
  14. struct BinaryTreeNode;
  15. typedef struct BinaryTreeNode *Position;
  16. typedef struct BinaryTreeNode *BinaryTree;
  17. BinaryTree MakeBinaryTree(BinaryTree T, ElementType X, BinaryTree Left, BinaryTree Right);
  18. ElementType RetrieveInBinaryTree(Position P);
  19. void PreOrderTraverseBinaryTree(BinaryTree T);
  20. void InOrderTraverseBinaryTree(BinaryTree T);
  21. void PostOrderTraverseBinaryTree(BinaryTree T);
  22. int NodeCountOfBinaryTree(BinaryTree T);
  23. int HeightOfBinaryTree(BinaryTree T);
  24. int MaxLengthOfBinaryTree(BinaryTree T);
  25. BinaryTree MakeBinaryTreeEmpty(BinaryTree T);
  26. #endif
  27. /*
  28. * BinaryTree.c - by FreeMan
  29. */
  30. #include "BinaryTree.h"
  31. #include "..\Fatal.h"
  32. #include <stdlib.h>
  33. struct BinaryTreeNode
  34. {
  35. ElementType Element;
  36. BinaryTree Left;
  37. BinaryTree Right;
  38. };
  39. BinaryTree MakeBinaryTree(BinaryTree T, ElementType X, BinaryTree Left, BinaryTree Right)
  40. {
  41. if (T == NULL)
  42. {
  43. T = malloc(sizeof(struct BinaryTreeNode));
  44. if (T == NULL)
  45. {
  46. FatalError("Out of memory!!");
  47. }
  48. }
  49. T->Element = X;
  50. T->Left = Left;
  51. T->Right = Right;
  52. return T;
  53. }
  54. ElementType RetrieveInBinaryTree(Position P)
  55. {
  56. return P->Element;
  57. }
  58. void PreOrderTraverseBinaryTree(BinaryTree T)
  59. {
  60. if (T != NULL)
  61. {
  62. printf("%d ", RetrieveInBinaryTree(T));
  63. PreOrderTraverseBinaryTree(T->Left);
  64. PreOrderTraverseBinaryTree(T->Right);
  65. }
  66. }
  67. void InOrderTraverseBinaryTree(BinaryTree T)
  68. {
  69. if (T != NULL)
  70. {
  71. InOrderTraverseBinaryTree(T->Left);
  72. printf("%d ", RetrieveInBinaryTree(T));
  73. InOrderTraverseBinaryTree(T->Right);
  74. }
  75. }
  76. void PostOrderTraverseBinaryTree(BinaryTree T)
  77. {
  78. if (T != NULL)
  79. {
  80. PostOrderTraverseBinaryTree(T->Left);
  81. PostOrderTraverseBinaryTree(T->Right);
  82. printf("%d ", RetrieveInBinaryTree(T));
  83. }
  84. }
  85. int NodeCountOfBinaryTree(BinaryTree T)
  86. {
  87. if (T == NULL)
  88. {
  89. return 0;
  90. }
  91. else
  92. {
  93. return 1 + NodeCountOfBinaryTree(T->Left) + NodeCountOfBinaryTree(T->Right);
  94. }
  95. }
  96. int HeightOfBinaryTree(BinaryTree T)
  97. {
  98. if (T == NULL)
  99. {
  100. return 0;
  101. }
  102. else
  103. {
  104. int LeftHeight = HeightOfBinaryTree(T->Left);
  105. int RightHeight = HeightOfBinaryTree(T->Right);
  106. return 1 + (Max(LeftHeight, RightHeight));
  107. }
  108. }
  109. int MaxLengthOfBinaryTree(BinaryTree T)
  110. {
  111. static int maxLength = 0;
  112. if (T != NULL)
  113. {
  114. maxLength = Max(MaxLengthOfNode(T), maxLength);
  115. MaxLengthOfBinaryTree(T->Left);
  116. MaxLengthOfBinaryTree(T->Right);
  117. }
  118. return maxLength;
  119. }
  120. static int Max(int Lhs, int Rhs)
  121. {
  122. return Lhs > Rhs ? Lhs : Rhs;
  123. }
  124. static int MaxLengthOfNode(Position P)
  125. {
  126. if (P == NULL)
  127. {
  128. return 0;
  129. }
  130. int leftHeight = HeightOfBinaryTree(P->Left);
  131. int rightHeight = HeightOfBinaryTree(P->Right);
  132. int maxLength = leftHeight + rightHeight;
  133. return maxLength;
  134. }
  135. BinaryTree MakeBinaryTreeEmpty(BinaryTree T)
  136. {
  137. if (T != NULL)
  138. {
  139. MakeBinaryTreeEmpty(T->Left);
  140. MakeBinaryTreeEmpty(T->Right);
  141. free(T);
  142. }
  143. return NULL;
  144. }
  145. /*
  146. * BinaryTreeTest.c - by FreeMan
  147. */
  148. #include "BinaryTree.h"
  149. #include <stdio.h>
  150. main()
  151. {
  152. printf("Testing Binary Tree...\n");
  153. BinaryTree A;
  154. Position A1 = NULL, A2 = NULL, A3 = NULL, A4 = NULL, A5 = NULL,
  155. A6 = NULL, A7 = NULL;
  156. A7 = MakeBinaryTree(A7, 7, NULL, NULL);
  157. A6 = MakeBinaryTree(A6, 6, NULL, NULL);
  158. A5 = MakeBinaryTree(A5, 5, NULL, NULL);
  159. A4 = MakeBinaryTree(A4, 4, NULL, NULL);
  160. A3 = MakeBinaryTree(A3, 3, A6, A7);
  161. A2 = MakeBinaryTree(A2, 2, A4, A5);
  162. A1 = MakeBinaryTree(A1, 1, A2, A3);
  163. A = A1;
  164. printf("\nTree A:\n");
  165. printf("Pre Order Traverse: ");
  166. PreOrderTraverseBinaryTree(A);
  167. printf("\nIn Order Traverse: ");
  168. InOrderTraverseBinaryTree(A);
  169. printf("\nPost Order Traverse: ");
  170. PostOrderTraverseBinaryTree(A);
  171. printf("\nNode Count: %d", NodeCountOfBinaryTree(A));
  172. printf("\nHeight: %d", HeightOfBinaryTree(A));
  173. printf("\nMax Length: %d", MaxLengthOfBinaryTree(A));
  174. MakeBinaryTreeEmpty(A);
  175. printf("\n\nTree B:\n");
  176. BinaryTree B;
  177. Position B1 = NULL, B2 = NULL, B3 = NULL, B4 = NULL, B5 = NULL,
  178. B6 = NULL, B7 = NULL, B8 = NULL, B9 = NULL, B10 = NULL,
  179. B11 = NULL, B12 = NULL;
  180. B12 = MakeBinaryTree(B12, 12, NULL, NULL);
  181. B11 = MakeBinaryTree(B11, 11, NULL, B12);
  182. B10 = MakeBinaryTree(B10, 10, NULL, B11);
  183. B9 = MakeBinaryTree(B9, 9, NULL, NULL);
  184. B8 = MakeBinaryTree(B8, 8, B9, NULL);
  185. B7 = MakeBinaryTree(B7, 7, NULL, B10);
  186. B6 = MakeBinaryTree(B6, 6, B8, NULL);
  187. B5 = MakeBinaryTree(B5, 5, NULL, NULL);
  188. B4 = MakeBinaryTree(B4, 4, NULL, NULL);
  189. B3 = MakeBinaryTree(B3, 3, B6, B7);
  190. B2 = MakeBinaryTree(B2, 2, B4, B5);
  191. B1 = MakeBinaryTree(B1, 1, B2, B3);
  192. B = B1;
  193. printf("Pre Order Traverse: ");
  194. PreOrderTraverseBinaryTree(B);
  195. printf("\nIn Order Traverse: ");
  196. InOrderTraverseBinaryTree(B);
  197. printf("\nPost Order Traverse: ");
  198. PostOrderTraverseBinaryTree(B);
  199. printf("\nNode Count: %d", NodeCountOfBinaryTree(B));
  200. printf("\nHeight: %d", HeightOfBinaryTree(B));
  201. printf("\nMax Length: %d", MaxLengthOfBinaryTree(B));
  202. MakeBinaryTreeEmpty(B);
  203. return 0;
  204. }
  205. // Output:
  206. /*
  207. Testing Binary Tree...
  208. Tree A:
  209. Pre Order Traverse: 1 2 4 5 3 6 7
  210. In Order Traverse: 4 2 5 1 6 3 7
  211. Post Order Traverse: 4 5 2 6 7 3 1
  212. Node Count: 7
  213. Height: 3
  214. Max Length: 4
  215. Tree B:
  216. Pre Order Traverse: 1 2 4 5 3 6 8 9 7 10 11 12
  217. In Order Traverse: 4 2 5 1 9 8 6 3 7 10 11 12
  218. Post Order Traverse: 4 5 2 9 8 6 12 11 10 7 3 1
  219. Node Count: 12
  220. Height: 6
  221. Max Length: 7
  222. */

发表评论

表情:
评论列表 (有 0 条评论,290人围观)

还没有评论,来说两句吧...

相关阅读