Advertisement
Scratius

Untitled

Feb 25th, 2020
251
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.61 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <stdlib.h>
  4.  
  5.  
  6. typedef struct node {
  7.     int value;
  8.     node* right;
  9.     node* left;
  10. } node;
  11. void cleartree(node* root);
  12. void print_tree(node* rootr);
  13. node* add_node(node* rootr, int value);
  14. node* getmin(node* root);
  15. node* getmax(node* root);
  16. node* deletenode(node* root, int value);
  17.  
  18.  
  19. int main()
  20. {
  21.     node* rootr = NULL;
  22.  
  23.     rootr = add_node(rootr, 45);
  24.     rootr = add_node(rootr, 51);
  25.     rootr = add_node(rootr, 35);
  26.     rootr = add_node(rootr, 23);
  27.     rootr = add_node(rootr, 65);
  28.     rootr = add_node(rootr, 105);
  29.     rootr = add_node(rootr, 57);
  30.     rootr = add_node(rootr, 34);
  31.     rootr = add_node(rootr, 65);
  32.     rootr = add_node(rootr, 45);
  33.     deletenode(rootr, 23);
  34.     print_tree(rootr);
  35.     return 0;
  36. }
  37.  
  38. node* add_node(node* rootr, int value) {
  39.     node* new_node = (node*)malloc(sizeof(node));
  40.     new_node->value = value;
  41.     new_node->left = NULL;
  42.     new_node->right = NULL;
  43.     if (rootr == NULL) {
  44.         return new_node;
  45.     }
  46.     node* curr = rootr;
  47.     while (curr) {
  48.         if (curr->value == value) {
  49.             free(new_node);
  50.             return rootr;
  51.         }
  52.         if (curr->value < value) {
  53.             if (curr->right != NULL) {
  54.                 curr = curr->right;
  55.                 continue;
  56.             }
  57.             else {
  58.                 curr->right = new_node;
  59.                 return rootr;
  60.             }
  61.         }
  62.         if (curr->value > value) {
  63.             if (curr->left != NULL) {
  64.                 curr = curr->left;
  65.                 continue;
  66.             }
  67.             else {
  68.                 curr->left = new_node;
  69.                 return rootr;
  70.             }
  71.         }
  72.     }
  73.     return rootr;
  74. }
  75.  
  76. node* deletenode(node* root, int value) {
  77.     if (!root) {
  78.         return NULL;
  79.     }
  80.     if (root->value > value) {
  81.         root->left = deletenode(root->left, value);
  82.     }
  83.     if (root->value < value) {
  84.         root->right = deletenode(root->right, value);
  85.     }
  86.     if (root->value == value) {
  87.         if (!root->left && !root->right) {
  88.             free(root);
  89.             return NULL;
  90.         }
  91.         node* temp = NULL;
  92.         if (root->left && !root->right) {
  93.             temp = root->left;
  94.             free(root);
  95.             return temp;
  96.         }
  97.         if (!root->left && root->right) {
  98.             temp = root->right;
  99.             free(root);
  100.             return temp;
  101.         }
  102.         if (root->left && root->right) {
  103.             int maxleft = getmax(root->left)->value;
  104.             int minright = getmin(root->right)->value;
  105.             if (root->value - maxleft < minright - root->value) {
  106.                 deletenode(root, maxleft);
  107.                 root->value = maxleft;
  108.             }
  109.             else {
  110.                 deletenode(root, minright);
  111.                 root->value = minright;
  112.             }
  113.         }
  114.  
  115.  
  116.     }
  117.     return root;
  118. }
  119.  
  120. void print_tree(node* rootr) {
  121.     if (rootr->left) {
  122.         print_tree(rootr->left);
  123.     }
  124.     printf("%4d", rootr->value);
  125.  
  126.     if (rootr->right) {
  127.         print_tree(rootr->right);
  128.     }
  129.     return;
  130. }
  131.  
  132. void cleartree(node* root) {
  133.     if (root) {
  134.         if (root->left) {
  135.             cleartree(root->left);
  136.         }
  137.         if (root->right) {
  138.             cleartree(root->right);
  139.         }
  140.         free(root);
  141.     }
  142. }
  143.  
  144.  
  145.  
  146.  
  147.  
  148. node* getmin(node* root) {
  149.     node* temp = root;
  150.     while (temp->left) {
  151.         temp = temp->left;
  152.     }
  153.     return temp;
  154. }
  155. node* getmax(node* root) {
  156.     node* temp = root;
  157.     while (temp->right) {
  158.         temp = temp->right;
  159.     }
  160.     return temp;
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement