Platinum2d

Binary Tree - Modular code

Jun 6th, 2017
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.06 KB | None | 0 0
  1. //basic.h
  2.  
  3. #ifndef BASIC_H
  4. #define BASIC_H
  5. #define _CRT_SECURE_NO_WARNINGS
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <stdbool.h>
  9. #include <stdint.h>
  10. #include <math.h>
  11. #include <string.h>
  12.  
  13. typedef int element;
  14.  
  15. typedef struct item {
  16.     element value;
  17.     struct item *left, *right;
  18. } node;
  19.  
  20. typedef node* tree;
  21.  
  22. extern bool empty(tree t);
  23. extern tree emptyTree();
  24. extern element root(tree t);
  25. extern tree left(tree t);
  26. extern tree right(tree t);
  27. extern void showElement(element e);
  28. extern tree consTree(element e, tree l, tree r);
  29. extern bool isLess(element lhs, element rhs);
  30. extern bool isEqual(element lhs, element rhs);
  31. extern bool isGreater(element lhs, element rhs);
  32. extern void destroyTree(tree t);
  33. extern tree find(element e, tree t);
  34. extern void preOrder(tree t);
  35. extern void postOrder(tree t);
  36. extern void inOrder(tree t);
  37. extern bool booleanSearch(element e, tree t);
  38. extern tree find(element e, tree t);
  39. extern uint32_t height(tree t);
  40. extern void deleteElement(element e, tree t);
  41.  
  42. //BST (Binary Search Tree) algorithms
  43. extern tree insOrdTree(element e, tree t);
  44.  
  45. #endif /*!BASIC_H*/
  46.  
  47. //basic.c
  48.  
  49. bool isEqual(element lhs, element rhs)
  50. {
  51.     return lhs == rhs;
  52. }
  53.  
  54. bool isLess(element lhs, element rhs)
  55. {
  56.     return lhs < rhs;
  57. }
  58.  
  59. bool isGreater(element lhs, element rhs)
  60. {
  61.     return !isLess(lhs, rhs) && !isEqual(lhs, rhs);
  62. }
  63.  
  64. bool empty(tree t)
  65. {
  66.     return (t == NULL);
  67. }
  68.  
  69. tree emptyTree()
  70. {
  71.     return NULL;
  72. }
  73.  
  74. element root(tree t)
  75. {
  76.     if (empty(t)) abort();
  77.     return t->value;
  78. }
  79.  
  80. tree left(tree t)
  81. {
  82.     if (empty(t)) abort();
  83.     return t->left;
  84. }
  85.  
  86. tree right(tree t)
  87. {
  88.     if (empty(t)) abort();
  89.     return t->right;
  90. }
  91.  
  92. tree consTree(element e, tree l, tree r)
  93. {
  94.     tree t = malloc(sizeof(node));
  95.     t->value = e;
  96.     t->left = l;
  97.     t->right = r;
  98.  
  99.     return t;
  100. }
  101.  
  102. void showElement(element e)
  103. {
  104.     printf("%d", e);
  105. }
  106.  
  107. void preOrder(tree t)
  108. {
  109.     if (!empty(t))
  110.     {
  111.         printf("\t");
  112.         showElement(root(t));
  113.         preOrder(left(t));
  114.         preOrder(right(t));
  115.     }
  116. }
  117.  
  118. void postOrder(tree t)
  119. {
  120.     if (!empty(t))
  121.     {
  122.         postOrder(left(t));
  123.         postOrder(right(t));
  124.         printf("\t");
  125.         showElement(root(t));
  126.     }
  127. }
  128.  
  129. void inOrder(tree t)
  130. {
  131.     if (!empty(t))
  132.     {
  133.         inOrder(left(t));
  134.         printf("\t");
  135.         showElement(root(t));
  136.         inOrder(right(t));
  137.     }
  138. }
  139.  
  140. bool booleanSearch(element e, tree t)
  141. {
  142.     if (empty(t)) return false;
  143.  
  144.     if (isEqual(root(t), e)) return true;
  145.     else
  146.         return (booleanSearch(e, left(t)) || booleanSearch(e, right(t)));
  147. }
  148.  
  149. void destroyTree(tree t)
  150. {
  151.     if (!empty(t))
  152.     {
  153.         tree l = left(t), r = right(t);
  154.         free(t);
  155.         destroyTree(l); destroyTree(r);
  156.     }
  157. }
  158.  
  159. tree find(element e, tree t)
  160. {
  161.     if (!empty(t))
  162.     {
  163.         if (isEqual(root(t), e)) return t;
  164.  
  165.         tree l = find(e, left(t));
  166.         if (!empty(l)) return l;
  167.  
  168.         tree r = find(e, right(t));
  169.         if (!empty(r)) return r;
  170.         else
  171.             return emptyTree();
  172.        
  173.     }
  174.     else
  175.         return emptyTree();
  176. }
  177.  
  178. uint32_t height(tree t)
  179. {
  180.     if (empty(t)) return 0;
  181.     else
  182.     {
  183.         uint32_t hl = height(left(t)),
  184.             hr = height(right(t));
  185.         return 1 + (hl>hr ? hl : hr);
  186.     }
  187. }
  188.  
  189. tree insOrdTree(element e, tree t)
  190. {
  191.     if (empty(t))
  192.         return consTree(e, emptyTree(), emptyTree());
  193.     else
  194.         if (isLess(e, root(t)) || isEqual(e, root(t)))
  195.             return consTree(root(t), insOrdTree(e, left(t)), right(t));
  196.         else
  197.             return consTree(root(t), left(t), insOrdTree(e, right(t)));
  198. }
  199.  
  200. void deleteElement(element e, tree t)
  201. {
  202.     tree l = t, fl = emptyTree(), fr = emptyTree();
  203.  
  204.     while (root(t) != e && !empty(t))
  205.     {
  206.         if (root(t) <= e)
  207.         {
  208.             fr = t;
  209.             fl = emptyTree();
  210.             t = right(t);
  211.         }
  212.         else
  213.         {
  214.             fl = t;
  215.             fr = emptyTree();
  216.             t = left(t);
  217.         }
  218.     }
  219.  
  220.     if (!empty(left(t)) && !empty(right(t)))
  221.     {
  222.         fr = t;
  223.         fl = emptyTree();
  224.         tree next = right(t);
  225.         if (!empty(next))
  226.             while (!empty(left(next)))
  227.             {
  228.                 fr = emptyTree();
  229.                 fl = next;
  230.                 next = left(next);
  231.             }
  232.         t->value = root(next);
  233.  
  234.         next = (!empty(right(next))) ? right(next) : emptyTree();
  235.  
  236.         if (!empty(fl))
  237.             fl->left = next;
  238.         else
  239.             fr->right = next;
  240.     }
  241. }
  242.  
  243. int main(void)
  244. {
  245.     return EXIT_SUCCESS;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment