Advertisement
Guest User

Untitled

a guest
May 21st, 2019
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.71 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <iostream>
  4. #include <ostream>
  5. template <typename T>
  6. class Node
  7. {
  8. private:
  9. Node* left;
  10. Node * right;
  11. T data;
  12. public:
  13. Node(const Node& Item)
  14. {
  15. left = Item.left;
  16. right = Item.right;
  17. data = Item.data;
  18. }
  19. Node(T value)
  20. {
  21. left = nullptr;
  22. right = nullptr;
  23. data = value;
  24. }
  25. T get_data() const
  26. {
  27. return data;
  28. }
  29. void add(T value); //добавление нового элемента
  30. bool search(T value) const; //проверка - есть ли элемент с заданным
  31. bool remove(T value);
  32. T get_min() const;
  33. T get_max() const;
  34. void printVozrast() const;
  35. void printUbiv() const;
  36. friend std::ostream& operator«(std::ostream& os, const Node<T>& node);
  37.  
  38. };
  39. template <typename T>
  40. class BinaryTree
  41. {
  42. private:
  43. Node<T>* root;
  44. public:
  45. BinaryTree()
  46. {
  47. root = nullptr;
  48. std::cout « "Tree created" « std::endl;// вывод
  49. }//конструктор
  50. bool isEmpty() const
  51. {
  52. return(root ? false : true)
  53. }//проверяет на существования корня
  54. void add(T value);//добавление узла
  55. bool search(T value) const;//поиск узла с заданным значением
  56. void remove(T value);//при тру поиск и при нахождении удаление , при фалс не удаляет ничего (значит нет такого узла)
  57. T getMin()const;
  58. T getMax()const;
  59. void print(bool ubivanie = false)const;
  60. ~BinaryTree();
  61. friend std::ostream& operator«(std::ostream& os, const BinaryTree<T>& tree);
  62. };
  63.  
  64.  
  65.  
  66.  
  67. template <typename T>
  68. void Node<T>::add(T value)
  69. {
  70. // элемент должен попасть в право
  71. if (value > data)
  72. //если правое существует
  73. if (right)
  74. //рекурсивно
  75. right->add(value);
  76. else
  77. //иначе создаём новый и ставим его правым
  78. right = new Node(value);
  79. //ВАЖНО!!!
  80. //оператор new распределяет динамическую память,
  81. //но при этом ещё и вызывается конструктор для создаваемого объекта
  82.  
  83. //добавляемый элемент должен попасть в левое поддерево
  84. if (value < data)
  85. if (left)
  86. left->add(value);
  87. else
  88. left = new Node(value);
  89. }
  90. template <typename T>
  91. Node<T>* Node<T>::search(T value)const
  92. {
  93. //если нашли - вернули адрес узла
  94. if (data == value)
  95. {
  96. return this;
  97. }
  98.  
  99. if(value > data)
  100. {
  101. if (right)
  102. return right->search(value);
  103. else
  104. return nullptr;
  105. }
  106. else
  107. if (left)
  108. {
  109. return left->search(value);
  110. }
  111. else
  112. return nullptr;
  113. }
  114.  
  115.  
  116. template <typename T>
  117. Node<T>* Node<T>::remove(T value)
  118. {
  119.  
  120. Node<T>* udalenie = nullptr;
  121.  
  122. if (value > data && right)
  123. {
  124.  
  125. udalenie = right->remove(T value);
  126.  
  127. if (udalenie == right)
  128. {
  129. right = nullptr;
  130. }
  131. }
  132.  
  133. if (value < data && left)
  134. {
  135. udalenie = left->remove(value);
  136. if (udalenie == left)
  137. left = nullptr;
  138. }
  139.  
  140. if (data == value)
  141. {
  142. if (!left && !right)
  143. {
  144. udalenie = this;
  145. }
  146. if (left && !right)
  147. {
  148. udalenie = left;
  149. *this = *left;
  150. }
  151.  
  152. if (!left && right)
  153. {
  154. udalenie = right;
  155. *this = *right;
  156. }
  157. }
  158.  
  159. if (left && right)
  160. {
  161.  
  162. int max_left = left->get_max()->data;
  163. int min_right = right->get_min()->data;
  164.  
  165. if ((data - max_left) < (min_right - data))
  166. {
  167.  
  168. udalenie = left->remove(max_left);
  169.  
  170. data = max_left;
  171. }
  172. else
  173. {
  174.  
  175. udalenie = right->remove(min_right);
  176. data = min_right;
  177. }
  178. }
  179.  
  180. if (udalenie)
  181. {
  182.  
  183. udalenie->left = nullptr;
  184. udalenie->right = nullptr;
  185.  
  186. }
  187. return udalenie;
  188. }
  189.  
  190.  
  191. template <typename T>
  192. T Node<T>::get_min()const
  193. {
  194.  
  195. if (left)
  196. return left->get_min();//рекурсивно
  197. else
  198.  
  199. return this;
  200. }
  201. template <typename T>
  202. T Node<T>::get_max()const
  203. {
  204.  
  205. if (left)
  206. return left->get_max();
  207. else
  208.  
  209. return this;
  210. }
  211.  
  212. template <typename T>
  213. Node<T>::~Node()
  214. {
  215.  
  216.  
  217. if (left)
  218. delete left;
  219. if (right)
  220. delete right;
  221.  
  222.  
  223. std::cout « "destructor work! " « data « endl;
  224. }
  225. template <typename T>
  226. std::ostream& Node<T>::operator«(std::ostream& os, const Node<T>& node)
  227. {
  228. os « node->get_data() « std::endl;
  229. return os;
  230. }
  231. template <typename T>
  232. void Node<T>::printVozrast() const
  233. {
  234. if (left)
  235. left->printVozrast(); //обходим левое
  236.  
  237. cout « data « " "; //печатаем содержимое
  238.  
  239. if (right)
  240. right->printVozrast(); //обхдим правое
  241. }
  242. template <typename T>
  243. void Node<T>::printUbiv() const
  244. {
  245.  
  246. if
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement