Advertisement
Guest User

Untitled

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