Advertisement
Pug_coder

kekw

Jan 10th, 2021
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.92 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. typedef struct Node Node;
  7.  
  8. struct Node
  9. {
  10. int key, count;
  11. char *value;
  12. Node *parent, *left, *right;
  13. };
  14. Node *tree_find_node(Node *root, int key)
  15. {
  16. Node *node = root;
  17. while(node && node->key != key)
  18. {
  19. if(key < node->key) node = node->left;
  20. else node = node->right;
  21. }
  22. return node;
  23. }
  24.  
  25. void tree_insert( Node **root, int key, char *value)
  26. {
  27. Node *new_node = (Node *)malloc(sizeof(Node));
  28. new_node->key = key;
  29. new_node->value = value;
  30. new_node->count = 0;
  31. new_node->parent = NULL; new_node->left = NULL; new_node->right = NULL;
  32.  
  33. if(!*root)
  34. {
  35. *root = new_node;
  36. return;
  37. }
  38.  
  39. Node *node = *root;
  40. for(unsigned char k = 0; k < 300; k++)
  41. {
  42. node->count++;
  43. if(key < node->key)
  44. {
  45. if(!node->left)
  46. {
  47. node->left = new_node;
  48. new_node->parent = node;
  49. break;
  50. }
  51. node = node->left;
  52. }
  53. else
  54. {
  55. if(!node->right)
  56. {
  57. node->right = new_node;
  58. new_node->parent = node;
  59. break;
  60. }
  61. node = node->right;
  62. }
  63.  
  64. }
  65. }
  66.  
  67. void replace_node(Node **root, Node *x, Node *y)
  68. {
  69. if(*root == x)
  70. {
  71. *root = y;
  72. if(y) y->parent = NULL;
  73. }
  74. else
  75. {
  76. Node *parent = x->parent;
  77. if(y) y->parent = parent;
  78.  
  79. if(parent->left == x) parent->left = y;
  80. else parent->right = y;
  81. }
  82. }
  83.  
  84. Node *minimum(Node *node)
  85. {
  86. if(!node) return NULL;
  87. else
  88. {
  89. while(node->left)
  90. {
  91. node->count--;
  92. node = node->left;
  93. }
  94. return node;
  95. }
  96. }
  97.  
  98. Node *succ(Node *node)
  99. {
  100. if(node->right)
  101. {
  102. return minimum(node->right);
  103. }
  104. else
  105. {
  106. Node *node_ = node->parent;
  107. while(node_ && node == node_->right)
  108. {
  109. node = node_;
  110. node_ = node_->parent;
  111. }
  112. return node_;
  113. }
  114. }
  115.  
  116. void clear_tree(Node *node)
  117. {
  118. if(node)
  119. {
  120. if(node->right)
  121. clear_tree(node->right);
  122. if(node->left)
  123. clear_tree(node->left);
  124. free(node->value);
  125. free(node);
  126. }
  127. }
  128. void delete(Node **root, int key)
  129. {
  130. Node *node = tree_find_node(*root, key);
  131. Node *tr = *root;
  132. while(tr && tr->key != key)
  133. {
  134. tr->count--;
  135. if(key < tr->key) tr = tr->left;
  136. else tr = tr->right;
  137. }
  138.  
  139. if(!node->left && !node->right) replace_node(root, node, NULL);
  140. else if(!node->left) replace_node(root, node, node->right);
  141. else if(!node->right) replace_node(root, node, node->left);
  142. else
  143. {
  144. Node *y = succ(node);
  145. replace_node(root, y, y->right);
  146. node->left->parent = y;
  147. y->left = node->left;
  148. if(node->right) node->right->parent = y;
  149. y->right = node->right;
  150. y->count = node->count - 1;
  151. replace_node(root, node, y);
  152. }
  153. free(node->value);
  154. free(node);
  155. }
  156.  
  157. Node *search(Node *root, int rank)
  158. {
  159. Node *node = root;
  160. while(node)
  161. {
  162. if(node->left)
  163. {
  164. if(node->left->count == rank - 1) return node;
  165. else if(node->left->count > rank - 1) node = node->left;
  166. else
  167. {
  168. rank -= node->left->count + 2;
  169. node = node->right;
  170. }
  171. }
  172. else
  173. {
  174. if(rank)
  175. {
  176. rank--;
  177. node = node->right;
  178. }
  179. else return node;
  180. }
  181. }
  182. }
  183. int main()
  184. {
  185. int n;
  186. scanf("%d", &n);
  187. Node *root = NULL;
  188. char action[7], *word;
  189. for(int i = 0; i < n; i++)
  190. {
  191. scanf("%s", action);
  192. int x;
  193. scanf("%d", &x);
  194. if(strcmp("INSERT", action) == 0)
  195. {
  196.  
  197. word = (char *)malloc(sizeof(char) * 10);
  198. scanf("%s", word);
  199. tree_insert(&root, x, word);
  200. }
  201. if(strcmp("SEARCH", action) == 0)
  202.  
  203. printf("%s\n", search(root, x)->value);
  204.  
  205. if(strcmp("LOOKUP", action) == 0)
  206. printf("%s\n", tree_find_node(root, x)->value);
  207.  
  208. if(strcmp("DELETE", action) == 0)
  209. delete(&root, x);
  210. }
  211.  
  212. clear_tree(root);
  213. return 0;
  214. }
  215.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement