Data Structure - Splay Tree (C)

谁践踏了优雅 2023-01-22 02:54 43阅读 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. * SplayTree.h - by FreeMan
  10. */
  11. typedef int ElementType;
  12. #define Infinity 30000
  13. #define NegInfinity (-30000)
  14. #ifndef _SplayTree_H_
  15. #define _SplayTree_H_
  16. struct SplayNode;
  17. typedef struct SplayNode *SplayTree;
  18. SplayTree MakeSplayTreeEmpty(SplayTree T);
  19. SplayTree FindInSplayTree(ElementType X, SplayTree T);
  20. SplayTree FindMinInSplayTree(SplayTree T);
  21. SplayTree FindMaxInSplayTree(SplayTree T);
  22. SplayTree InitializeSplayTree(void);
  23. SplayTree InsertInSplayTree(ElementType X, SplayTree T);
  24. SplayTree RemoveInSplayTree(ElementType X, SplayTree T);
  25. ElementType RetrieveInSplayTree(SplayTree T); /* Gets root item */
  26. #endif
  27. /*
  28. * SplayTree.c - by FreeMan
  29. */
  30. #include "SplayTree.h"
  31. #include "Fatal.h"
  32. #include <stdlib.h>
  33. struct SplayNode
  34. {
  35. ElementType Element;
  36. SplayTree Left;
  37. SplayTree Right;
  38. };
  39. typedef struct SplayNode *Position;
  40. static Position NullNode = NULL; /* Needs initialization */
  41. SplayTree InitializeSplayTree(void)
  42. {
  43. if (NullNode == NULL)
  44. {
  45. NullNode = malloc(sizeof(struct SplayNode));
  46. if (NullNode == NULL)
  47. {
  48. FatalError("Out of memory!!");
  49. }
  50. NullNode->Left = NullNode->Right = NullNode;
  51. }
  52. return NullNode;
  53. }
  54. static SplayTree Splay(ElementType Item, Position X);
  55. SplayTree MakeSplayTreeEmpty(SplayTree T)
  56. {
  57. if (T != NullNode)
  58. {
  59. MakeSplayTreeEmpty(T->Left);
  60. MakeSplayTreeEmpty(T->Right);
  61. free(T);
  62. }
  63. return NullNode;
  64. }
  65. void PrintTree(SplayTree T)
  66. {
  67. if (T != NullNode)
  68. {
  69. PrintTree(T->Left);
  70. printf("%d ", T->Element);
  71. PrintTree(T->Right);
  72. }
  73. }
  74. SplayTree FindInSplayTree(ElementType X, SplayTree T)
  75. {
  76. return Splay(X, T);
  77. }
  78. SplayTree FindMinInSplayTree(SplayTree T)
  79. {
  80. return Splay(NegInfinity, T);
  81. }
  82. SplayTree FindMaxInSplayTree(SplayTree T)
  83. {
  84. return Splay(Infinity, T);
  85. }
  86. /*
  87. * This function can be called only if K2 has a left child.
  88. * Perform a rotate between a node (K2) and its left child.
  89. * Update heights, then return new root.
  90. */
  91. static Position SingleRotateWithLeft(Position K2)
  92. {
  93. Position K1;
  94. K1 = K2->Left;
  95. K2->Left = K1->Right;
  96. K1->Right = K2;
  97. return K1; /* New root */
  98. }
  99. /*
  100. * This function can be called only if K1 has a right child.
  101. * Perform a rotate between a node (K1) and its right child.
  102. * Update heights, then return new root.
  103. */
  104. static Position SingleRotateWithRight(Position K1)
  105. {
  106. Position K2;
  107. K2 = K1->Right;
  108. K1->Right = K2->Left;
  109. K2->Left = K1;
  110. return K2; /* New root */
  111. }
  112. /* Top-down splay procedure, not requiring item to be in tree. */
  113. SplayTree Splay(ElementType Item, Position X)
  114. {
  115. static struct SplayNode Header;
  116. Position LeftTreeMax, RightTreeMin;
  117. Header.Left = Header.Right = NullNode;
  118. LeftTreeMax = RightTreeMin = &Header;
  119. NullNode->Element = Item;
  120. while (Item != X->Element)
  121. {
  122. if (Item < X->Element)
  123. {
  124. if (Item < X->Left->Element)
  125. {
  126. X = SingleRotateWithLeft(X);
  127. }
  128. if (X->Left == NullNode)
  129. {
  130. break;
  131. }
  132. /* Link right */
  133. RightTreeMin->Left = X;
  134. RightTreeMin = X;
  135. X = X->Left;
  136. }
  137. else
  138. {
  139. if (Item > X->Right->Element)
  140. {
  141. X = SingleRotateWithRight(X);
  142. }
  143. if (X->Right == NullNode)
  144. {
  145. break;
  146. }
  147. /* Link left */
  148. LeftTreeMax->Right = X;
  149. LeftTreeMax = X;
  150. X = X->Right;
  151. }
  152. }
  153. /* Reassemble */
  154. LeftTreeMax->Right = X->Left;
  155. RightTreeMin->Left = X->Right;
  156. X->Left = Header.Right;
  157. X->Right = Header.Left;
  158. return X;
  159. }
  160. SplayTree InsertInSplayTree(ElementType Item, SplayTree T)
  161. {
  162. static Position NewNode = NULL;
  163. if (NewNode == NULL)
  164. {
  165. NewNode = malloc(sizeof(struct SplayNode));
  166. if (NewNode == NULL)
  167. {
  168. FatalError("Out of memory!!");
  169. }
  170. }
  171. NewNode->Element = Item;
  172. if (T == NullNode)
  173. {
  174. NewNode->Left = NewNode->Right = NullNode;
  175. T = NewNode;
  176. }
  177. else
  178. {
  179. T = Splay(Item, T);
  180. if (Item < T->Element)
  181. {
  182. NewNode->Left = T->Left;
  183. NewNode->Right = T;
  184. T->Left = NullNode;
  185. T = NewNode;
  186. }
  187. else if (T->Element < Item)
  188. {
  189. NewNode->Right = T->Right;
  190. NewNode->Left = T;
  191. T->Right = NullNode;
  192. T = NewNode;
  193. }
  194. else
  195. {
  196. return T; /* Already in the tree */
  197. }
  198. }
  199. NewNode = NULL; /* So next insert will call malloc */
  200. return T;
  201. }
  202. SplayTree RemoveInSplayTree(ElementType Item, SplayTree T)
  203. {
  204. Position NewTree;
  205. if (T != NullNode)
  206. {
  207. T = Splay(Item, T);
  208. if (Item == T->Element)
  209. {
  210. /* Found it! */
  211. if (T->Left == NullNode)
  212. {
  213. NewTree = T->Right;
  214. }
  215. else
  216. {
  217. NewTree = T->Left;
  218. NewTree = Splay(Item, NewTree);
  219. NewTree->Right = T->Right;
  220. }
  221. free(T);
  222. T = NewTree;
  223. }
  224. }
  225. return T;
  226. }
  227. ElementType RetrieveInSplayTree(SplayTree T)
  228. {
  229. return T->Element;
  230. }
  231. /*
  232. * SplayTreeTest.c - by FreeMan
  233. */
  234. #include "SplayTree.h"
  235. #include <stdio.h>
  236. #define NumItems 500
  237. main()
  238. {
  239. printf("Testing Splay Tree...\n");
  240. SplayTree T;
  241. SplayTree P;
  242. int i;
  243. int j = 0;
  244. T = InitializeSplayTree();
  245. T = MakeSplayTreeEmpty(T);
  246. for (i = 0; i < NumItems; i++, j = (j + 7) % NumItems)
  247. {
  248. T = InsertInSplayTree(j, T);
  249. }
  250. for (j = 0; j < 2; j++)
  251. for (i = 0; i < NumItems; i++)
  252. {
  253. T = FindInSplayTree(i, T);
  254. if (RetrieveInSplayTree(T) != i)
  255. {
  256. printf("Error1 at %d\n", i);
  257. }
  258. }
  259. for (i = 0; i < NumItems; i += 2)
  260. {
  261. T = RemoveInSplayTree(i, T);
  262. }
  263. for (i = 1; i < NumItems; i += 2)
  264. {
  265. T = FindInSplayTree(i, T);
  266. if (RetrieveInSplayTree(T) != i)
  267. {
  268. printf("Error2 at %d\n", i);
  269. }
  270. }
  271. for (i = 0; i < NumItems; i += 2)
  272. {
  273. T = FindInSplayTree(i, T);
  274. if (RetrieveInSplayTree(T) == i)
  275. {
  276. printf("Error3 at %d\n", i);
  277. }
  278. }
  279. printf("Min is %d\n", RetrieveInSplayTree(T = FindMinInSplayTree(T)));
  280. printf("Max is %d\n", RetrieveInSplayTree(T = FindMaxInSplayTree(T)));
  281. return 0;
  282. }
  283. // Output:
  284. /*
  285. Testing Splay Tree...
  286. Min is 1
  287. Max is 499
  288. */

发表评论

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

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

相关阅读