Data Structure - Search Tree (C)

矫情吗;* 2023-01-19 03:11 137阅读 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. * SearchTree.h - by FreeMan
  10. */
  11. typedef int ElementType;
  12. #ifndef _SearchTree_H_
  13. #define _SearchTree_H_
  14. struct TreeNode;
  15. typedef struct TreeNode *Position;
  16. typedef struct TreeNode *SearchTree;
  17. SearchTree MakeSearchTreeEmpty(SearchTree T);
  18. Position FindInSearchTree(ElementType X, SearchTree T);
  19. Position FindMinInSearchTree(SearchTree T);
  20. Position FindMaxInSearchTree(SearchTree T);
  21. SearchTree InsertInSearchTree(ElementType X, SearchTree T);
  22. SearchTree DeleteInSearchTree(ElementType X, SearchTree T);
  23. ElementType RetrieveInSearchTree(Position P);
  24. #endif
  25. /*
  26. * SearchTree.c - by FreeMan
  27. */
  28. #include "SearchTree.h"
  29. #include "..\Fatal.h"
  30. #include <stdlib.h>
  31. struct TreeNode
  32. {
  33. ElementType Element;
  34. SearchTree Left;
  35. SearchTree Right;
  36. };
  37. SearchTree MakeSearchTreeEmpty(SearchTree T)
  38. {
  39. if (T != NULL)
  40. {
  41. MakeSearchTreeEmpty(T->Left);
  42. MakeSearchTreeEmpty(T->Right);
  43. free(T);
  44. }
  45. return NULL;
  46. }
  47. Position FindInSearchTree(ElementType X, SearchTree T)
  48. {
  49. if (T == NULL)
  50. {
  51. return NULL;
  52. }
  53. if (X < T->Element)
  54. {
  55. return FindInSearchTree(X, T->Left);
  56. }
  57. else if (X > T->Element)
  58. {
  59. return FindInSearchTree(X, T->Right);
  60. }
  61. else
  62. {
  63. return T;
  64. }
  65. }
  66. Position FindMinInSearchTree(SearchTree T)
  67. {
  68. if (T == NULL)
  69. {
  70. return NULL;
  71. }
  72. else if (T->Left == NULL)
  73. {
  74. return T;
  75. }
  76. else
  77. {
  78. return FindMinInSearchTree(T->Left);
  79. }
  80. }
  81. Position FindMaxInSearchTree(SearchTree T)
  82. {
  83. if (T != NULL)
  84. {
  85. while (T->Right != NULL)
  86. {
  87. T = T->Right;
  88. }
  89. }
  90. return T;
  91. }
  92. SearchTree InsertInSearchTree(ElementType X, SearchTree T)
  93. {
  94. if (T == NULL)
  95. {
  96. /* Create and return a one-node tree */
  97. T = malloc(sizeof(struct TreeNode));
  98. if (T == NULL)
  99. {
  100. FatalError("Out of memory!!");
  101. }
  102. else
  103. {
  104. T->Element = X;
  105. T->Left = T->Right = NULL;
  106. }
  107. }
  108. else if (X < T->Element)
  109. {
  110. T->Left = InsertInSearchTree(X, T->Left);
  111. }
  112. else if (X > T->Element)
  113. {
  114. T->Right = InsertInSearchTree(X, T->Right);
  115. }
  116. /* Else X is in the tree already; we'll do nothing */
  117. return T;
  118. }
  119. SearchTree DeleteInSearchTree(ElementType X, SearchTree T)
  120. {
  121. Position TmpCell;
  122. if (T == NULL)
  123. {
  124. Error("Element not found!");
  125. }
  126. else if (X < T->Element) /* Go left */
  127. {
  128. T->Left = DeleteInSearchTree(X, T->Left);
  129. }
  130. else if (X > T->Element) /* Go right */
  131. {
  132. T->Right = DeleteInSearchTree(X, T->Right);
  133. }
  134. else /* Found element to be deleted */
  135. {
  136. if (T->Left && T->Right) /* Two children */
  137. {
  138. /* Replace with smallest in right subtree */
  139. TmpCell = FindMinInSearchTree(T->Right);
  140. T->Element = TmpCell->Element;
  141. T->Right = DeleteInSearchTree(T->Element, T->Right);
  142. }
  143. else /* One or zero children */
  144. {
  145. TmpCell = T;
  146. if (T->Left == NULL) /* Also handles 0 children */
  147. {
  148. T = T->Right;
  149. }
  150. else if (T->Right == NULL)
  151. {
  152. T = T->Left;
  153. }
  154. free(TmpCell);
  155. }
  156. }
  157. return T;
  158. }
  159. ElementType RetrieveInSearchTree(Position P)
  160. {
  161. return P->Element;
  162. }
  163. /*
  164. * SearchTreeTest.c - by FreeMan
  165. */
  166. #include "SearchTree.h"
  167. #include <stdio.h>
  168. main()
  169. {
  170. SearchTree T;
  171. Position P;
  172. int i;
  173. int j = 0;
  174. T = MakeSearchTreeEmpty(NULL);
  175. for (i = 0; i < 50; i++, j = (j + 7) % 50)
  176. {
  177. T = InsertInSearchTree(j, T);
  178. }
  179. for (i = 0; i < 50; i++)
  180. {
  181. if ((P = FindInSearchTree(i, T)) == NULL || RetrieveInSearchTree(P) != i)
  182. {
  183. printf("Error at %d\n", i);
  184. }
  185. }
  186. for (i = 0; i < 50; i += 2)
  187. {
  188. T = DeleteInSearchTree(i, T);
  189. }
  190. for (i = 1; i < 50; i += 2)
  191. {
  192. if ((P = FindInSearchTree(i, T)) == NULL || RetrieveInSearchTree(P) != i)
  193. {
  194. printf("Error at %d\n", i);
  195. }
  196. }
  197. for (i = 0; i < 50; i += 2)
  198. {
  199. if ((P = FindInSearchTree(i, T)) != NULL)
  200. {
  201. printf("Error at %d\n", i);
  202. }
  203. }
  204. printf("Min is %d, Max is %d\n",
  205. RetrieveInSearchTree(FindMinInSearchTree(T)),
  206. RetrieveInSearchTree(FindMaxInSearchTree(T)));
  207. return 0;
  208. }
  209. // Output:
  210. /*
  211. Min is 1, Max is 49
  212. */

发表评论

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

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

相关阅读