Advertisement
Pug_coder

s

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