Guest User

Untitled

a guest
Apr 19th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.01 KB | None | 0 0
  1. //file tree_item.h
  2. #ifndef TREE_ITEM_H
  3. #define TREE_ITEM_H
  4.  
  5. template <class T>
  6. struct Tree_item
  7. {
  8.     T value;
  9.     Tree_item * parent;
  10.     Tree_item * left;
  11.     Tree_item * right;
  12.  
  13.     Tree_item(const T &i)
  14.     {
  15.         parent = 0;
  16.         left = 0;
  17.         right = 0;
  18.         value = i;
  19.     }
  20. };
  21.  
  22. #endif
  23. ------------------------------
  24. //file tree.h
  25.  
  26.  
  27. #ifndef TREE_H
  28. #define TREE_H
  29.  
  30. #include "tree_item.h"
  31. #include <math.h>
  32. #include <algorithm>
  33.  
  34. template <class T>
  35. class Tree
  36. {  
  37. private:
  38.     Tree_item<T> *root;
  39.  
  40.     Tree_item<T>* find(int a) const;
  41.     Tree_item<T>* find(int a, Tree_item<T> *r) const;
  42.     void delete_tree(Tree_item<T> *a);
  43.    
  44.     Tree_item<T>* insert(T a, Tree_item<T> *r);
  45.     void delete_key(T a, Tree_item<T> *r);
  46.     Tree_item<T>* sift_down(Tree_item<T> *a);
  47.     Tree_item<T>* make_tree(const Tree_item<T> *a);
  48.  
  49.     static const int INF = 1 << 30;
  50. public:
  51.     Tree();
  52.     ~Tree();
  53.  
  54.     Tree(const Tree<T> &t);
  55.     Tree<T> & Tree<T>::operator = (const Tree<T> &t);
  56.  
  57.     void insert(T a);
  58.     bool exists(T a) const;
  59.     void delete_key(T a);
  60.     void swap(Tree<T> &t);
  61.     T next(T a, Tree_item<T> *x) const;
  62.     T prev(T a, Tree_item<T> *x) const;
  63. };
  64.  
  65. template <class T>
  66. Tree<T>::Tree()
  67. {
  68.     root = 0;
  69. }
  70.  
  71. template <class T>
  72. Tree<T>::~Tree()
  73. {
  74.     Tree<T>::delete_tree(root);
  75. }
  76.  
  77. template <class T>
  78. Tree<T>::Tree(const Tree<T> &t)
  79. {
  80.     root = make_tree(t.root);
  81. }
  82.  
  83. template <class T>
  84. Tree_item<T>* Tree<T>::make_tree(const Tree_item<T> *a)
  85. {
  86.     if (a == 0) {return 0;}
  87.     Tree_item<T> *x = new Tree_item<T>(a->value);
  88.     x->right = make_tree(a->right);
  89.     x->left = make_tree(a->left);
  90.     return x;
  91. }
  92.  
  93. template <class T>
  94. Tree<T> & Tree<T>::operator = (const Tree<T> &t)
  95. {
  96.     Tree<T> temp(t);
  97.     swap(temp);
  98.     return(*this);
  99. }
  100.  
  101. template <class T>
  102. Tree_item<T>* Tree<T>::find(int a) const
  103. {
  104.     return find(a, root);
  105. }
  106.  
  107. template <class T>
  108. Tree_item<T>* Tree<T>::find(int a, Tree_item<T> *r) const
  109. {
  110.     if (r == 0) return 0;
  111.     if (a < r->value) return find(a, r->left);
  112.     else if (r->value < a) return find(a, r->right);
  113.     else return r;
  114. }
  115.  
  116. template <class T>
  117. void Tree<T>::insert(T a)
  118. {
  119.     root = insert(a, root);
  120. }
  121.  
  122. template <class T>
  123. Tree_item<T>* Tree<T>::insert(T a, Tree_item<T> *r)
  124. {
  125.     if (r == 0)
  126.     {
  127.         Tree_item<T> *x  = new Tree_item<T>(a);
  128.         return x;
  129.     }
  130.  
  131.     if (a < r->value)
  132.     {
  133.         r->left = insert(a, r->left);
  134.         r->left->parent = r;
  135.     }
  136.     else
  137.     if (r->value < a)
  138.     {
  139.         r->right = insert(a, r->right);
  140.         r->right->parent = r;
  141.     }
  142.     return r;
  143. }
  144.  
  145. template <class T>
  146. bool Tree<T>::exists(T a) const
  147. {
  148.     if (Tree<T>::find(a) != 0) return true;
  149.     else return false;
  150. }
  151.  
  152. template <class T>
  153. void Tree<T>::delete_key(T a)
  154. {
  155.     Tree_item<T> *x = find(a, root);
  156.     delete_key(a, x);
  157. }
  158.  
  159. template <class T>
  160. void Tree<T>::delete_key(T a, Tree_item<T> *r)
  161. {
  162.     if (r == 0) return;
  163.     if (r->value == a)
  164.     {
  165.         Tree_item<T> *x = sift_down(r);
  166.         if (x == 0)
  167.         {
  168.             if (r->parent)
  169.             {
  170.                 if(r->parent->left == r) {r->parent->left = 0;}
  171.                 else {r->parent->right = 0;}
  172.             }
  173.             else
  174.             {
  175.                 root = 0;
  176.             }
  177.             delete r;
  178.             return;
  179.         }
  180.         r->value = x->value;
  181.         delete_key(x->value, x);
  182.     }
  183. }
  184.  
  185. template <class T>
  186. Tree_item<T>* Tree<T>::sift_down(Tree_item<T> *a)
  187. {
  188.     if (a->left)
  189.     {
  190.         Tree_item<T> *x = a->left;
  191.         while (x->right != 0) x = x->right;
  192.         return x;
  193.     }
  194.     if(a->right)
  195.     {
  196.         Tree_item<T> *x = a->right;
  197.         while (x->left != 0) x = x->left;
  198.         return x;
  199.     }
  200.     return 0;
  201. }
  202.  
  203. template <class T>
  204. void Tree<T>::delete_tree(Tree_item<T> *a)
  205. {
  206.     if (a == 0) {return;}
  207.     Tree<T>::delete_tree(a->left);
  208.     Tree<T>::delete_tree(a->right);
  209.     delete a;
  210. }
  211.  
  212. template <class T>
  213. T Tree<T>::next(T a, Tree_item<T> *x) const
  214. {
  215.     if (x == 0) {return INF;}
  216.     if (x->value <= a) {return Tree<T>::next(a, x->right);}
  217.     return min(x->value, next(a, x->left));
  218. }
  219.  
  220. template <class T>
  221. T Tree<T>::prev(T a, Tree_item<T> *x) const
  222. {
  223.     if (x == 0) {return -INF;}
  224.     if (x->value >= a) {return prev(a, x->left);}
  225.     return max(a->value, prev(a, x->right));
  226.  
  227. }
  228.  
  229. template <class T> 
  230. void Tree<T>::swap(Tree<T> &t)
  231. {
  232.     std::swap(root, t.root);
  233. }
  234.    
  235. #endif
Add Comment
Please, Sign In to add comment