Advertisement
saltycracker

SortedBinaryRemoveNode.c

Apr 18th, 2020
484
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.61 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4.  
  5. #define EMPTY NULL
  6. #define ARR_SIZE 10
  7.  
  8. struct btree {
  9.     int data;
  10.     struct btree *left;
  11.     struct btree *right;
  12. };
  13.  
  14. struct btree* add(struct btree * bt, int data) {
  15.     if (bt) {
  16.         if (bt->data < data) {
  17.             bt->left = add(bt->left, data);
  18.             return bt;
  19.         }else if (bt->data > data) {
  20.             bt->right = add(bt->right, data);
  21.             return bt;
  22.         }else {
  23.             return bt; 
  24.         }
  25.     }else {
  26.         struct btree * ans = (struct btree*)malloc(sizeof(struct btree));
  27.         if (!ans) {
  28.             fputs("alocation failed!\n", stderr);
  29.             exit(1);
  30.         }
  31.         ans->data = data;
  32.         ans->left = EMPTY;
  33.         ans->right = EMPTY;
  34.         return ans;
  35.     }
  36. }
  37.  
  38. void display(const struct btree * bt) {
  39.     if (bt) {
  40.         display(bt->left);
  41.         fprintf(stdout, "%d\n", bt->data);
  42.         display(bt->right);
  43.     }else {
  44.         fputs("EMPTY\n", stdout);
  45.     }
  46. }
  47.  
  48. const struct btree* find(const struct btree * bt, const int data) {
  49.     if (bt) {
  50.         if (bt->data < data) {
  51.             return find(bt->left, data);
  52.         }else if (bt->data > data) {
  53.             return find(bt->right, data);
  54.         }else {
  55.             return bt;
  56.         }
  57.     }else {
  58.         return bt;
  59.     }
  60. }
  61.  
  62. void freeBtree(struct btree * bt) {
  63.     if (bt) {
  64.         freeBtree(bt->left);
  65.         freeBtree(bt->right);
  66.         free(bt);
  67.     }
  68. }
  69.  
  70. struct btree* joinBranches(struct btree * left, struct btree * right) {
  71.     if (!left) {
  72.         return right;
  73.     }else if (!right) {
  74.         return left;
  75.     }else {
  76.         if (!right->left) {
  77.             right->left = left;
  78.             return right;
  79.         }else {
  80.             joinBranches(left, right->left);
  81.             return right;
  82.         }
  83.     }
  84. }
  85.  
  86. void removeNodeAux(struct btree ** bt, struct btree ** prev, bool left, const int data) {
  87.     if (*bt) {
  88.         if ((*bt)->data < data) {
  89.             removeNodeAux(&(*bt)->left, bt, true, data);
  90.         }else if ((*bt)->data > data) {
  91.             removeNodeAux(&(*bt)->right, bt, false, data);
  92.         }else {
  93.             if (*prev) {
  94.                 struct btree * l = (*bt)->left;
  95.                 struct btree * r = (*bt)->right;
  96.                 free(*bt);
  97.                 if (left) {
  98.                     (*prev)->left = joinBranches(l, r);
  99.                 }else {
  100.                     (*prev)->right = joinBranches(l, r);
  101.                 }
  102.             }else {
  103.                 struct btree * l = (*bt)->left;
  104.                 struct btree * r = (*bt)->right;
  105.                 free(*bt);
  106.                 (*bt) = joinBranches(l, r);
  107.             }
  108.         }
  109.     }
  110. }
  111.  
  112. void removeNode(struct btree ** bt, const int data) {
  113.     struct btree *prev = EMPTY;
  114.     removeNodeAux(bt, &prev, false, data);
  115. }
  116.  
  117. int main (int argc, char ** argv) {
  118.     int data[ARR_SIZE] = {10, 1, 8, 2, 3, 9, 7, 5, 6, 4};
  119.     struct btree * bt = EMPTY;
  120.     size_t i = 0;
  121.  
  122.     for (; i < ARR_SIZE; i++) {
  123.         bt = add(bt, data[i]);
  124.     }
  125.  
  126.     display(bt);
  127.  
  128.     removeNode(&bt, 5);
  129.  
  130.     fputs("\n\n", stdout);
  131.  
  132.     display(bt);
  133.  
  134.     freeBtree(bt);
  135.  
  136.     return 0;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement