Advertisement
Guest User

Untitled

a guest
Nov 15th, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.17 KB | None | 0 0
  1. #ifndef TREE_H
  2. #define TREE_H
  3.  
  4. #include <stdlib.h>
  5. #include <stdbool.h>
  6.  
  7. typedef struct{
  8.     Node* root;
  9.     int size;
  10. } tree;
  11.  
  12.  
  13.  
  14. tree* create_new_tree(){
  15.     tree* t = calloc(1, sizeof(tree));
  16.     return t;
  17. }
  18.  
  19. void private_insert(tree* t, Node *currRoot, Node* element){
  20.     if(element->value <= currRoot->value){
  21.         if(currRoot->left == NULL){
  22.             element->previous = currRoot;
  23.             currRoot->left = element;
  24.  
  25.         }
  26.         else private_insert(t, currRoot->left, element);
  27.     }
  28.     else{
  29.         if(currRoot->right == NULL){
  30.             element->previous = currRoot;
  31.             currRoot->right = element;
  32.         }
  33.         else private_insert(t, currRoot->right, element);
  34.     }
  35. }
  36.  
  37.  
  38.  
  39. void private_delete_tree(tree* t, Node* root){
  40.     if(root != NULL){
  41.         if(root->left != NULL) private_delete_tree(t, root->left);
  42.         if(root->right != NULL) private_delete_tree(t, root->right);
  43.         free(root);
  44.     }
  45. }
  46.  
  47. void private_print(tree* t, Node* root){
  48.     if(root != NULL){
  49.         printf(" (");
  50.         private_print(t, root->left);
  51.         printf(", %d,",root->value);
  52.         private_print(t, root->right);
  53.         printf(")");
  54.     }
  55.     else printf("n");
  56. }
  57.  
  58. void public_insert(tree* t, int value){
  59.     Node* element = createNode(value);
  60.     if(t->root == NULL) t->root=element;
  61.     else private_insert(t, t->root, element);
  62. }
  63.  
  64. bool public_contains(tree* t, int value){
  65.     Node* tmp = t->root;
  66.     while(tmp != NULL){
  67.         if(tmp->value == value) return true;
  68.         else{
  69.             if(value <= tmp->value) tmp = tmp->left;
  70.             else tmp = tmp->right;
  71.         }
  72.     }
  73.     return false;
  74. }
  75.  
  76. void public_print(tree* t){
  77.     private_print(t, t->root);
  78.     printf("\n");
  79. }
  80.  
  81. void public_delete_value(tree* t, int value){
  82.     Node* curr = t->root;
  83.  
  84.     while(curr->value != value){
  85.         if(value <= curr->value) curr = curr->left;
  86.         else curr = curr->right;
  87.  
  88.     }
  89.     //1. Fall
  90.     if(curr->left == NULL && curr->right == NULL){
  91.         free(curr);
  92.     }
  93.  
  94.     //2. Fall
  95.     Node* tmp = curr->previous;
  96.     if(curr->left != NULL && curr->right == NULL){
  97.  
  98.         if(tmp->left == curr){
  99.             tmp->left = curr->left;
  100.             curr->left->previous = tmp;
  101.             free(curr);
  102.         }
  103.  
  104.         if(tmp->right == curr){
  105.             tmp->right = curr->left;
  106.             curr->left->previous = tmp;
  107.             free(curr);
  108.         }
  109.     }
  110.  
  111.      if(curr->left == NULL && curr->right != NULL){
  112.  
  113.         if(tmp->left == curr){
  114.             tmp->left = curr->right;
  115.             curr->left->previous = tmp;
  116.             free(curr);
  117.         }
  118.  
  119.         if(tmp->right == curr){
  120.             tmp->right = curr->right;
  121.             curr->right->previous = tmp;
  122.             free(curr);
  123.         }
  124.      }
  125.  
  126.      //3. Fall
  127.      Node* previous_pos = curr->previous;
  128.      Node* position = curr;
  129.      Node* inorder = curr->right;
  130.  
  131.      while(inorder->left != NULL){
  132.          inorder = inorder->left;
  133.      }
  134.  
  135.      if(previous_pos->right == curr){
  136.  
  137.          previous_pos->right = inorder;
  138.          inorder->previous = previous_pos;
  139.          inorder->right = position->right;
  140.          position->right->left = NULL;
  141.          position->right->previous = position;
  142.          inorder->left = position->left;
  143.          free(curr);
  144.  
  145.      }
  146.  
  147.      if(previous_pos->left == curr){
  148.  
  149.          previous_pos->left = inorder;
  150.          inorder->previous = previous_pos;
  151.          inorder->right = position->right;
  152.          position->right->left = NULL;
  153.          position->right->previous = position;
  154.          inorder->left = position->left;
  155.          free(curr);
  156.  
  157.      }
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166. }
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement