Advertisement
illfate

Untitled

Apr 24th, 2019
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.58 KB | None | 0 0
  1. #pragma once
  2. #include <cassert>
  3. #include <deque>
  4. #include <iostream>
  5. #include <algorithm>
  6. #include <string>
  7. /*
  8. COPY OPERATOR/CONSTR-problems with destructor???
  9. NO CONST RVALUE
  10. NO RVALUE FUNCT
  11. NO MOVE OPERATOR
  12. NO CONST ITERS
  13. NO OVERLOADING OPERATORS
  14. NEED BALANCING
  15. PROBLEMS WITH STL FUNCTIONS?
  16. */
  17.  
  18. namespace tiit {
  19. template <typename T>
  20. struct Node {
  21. Node(T v, Node* p) :parent(p), value(v) { }
  22. T value;
  23. Node* left;
  24. Node* right;
  25. Node* parent;
  26.  
  27.  
  28. };
  29.  
  30. template <typename T>
  31. class set {
  32. private:
  33.  
  34. class iterator {
  35. private:
  36. Node<T>* pointer;
  37. public:
  38. iterator() {
  39. pointer = nullptr;
  40. }
  41. iterator(Node<T>* node) {
  42. pointer = node;
  43. }
  44. iterator(const iterator& it) {
  45. pointer = it.pointer;
  46. }
  47.  
  48. iterator& operator=(const iterator& it) {
  49. pointer = it.pointer;
  50. return *this;
  51. }
  52.  
  53. bool operator==(const iterator& it) const {
  54. return pointer == it.pointer;
  55. }
  56.  
  57. bool operator!=(const iterator& it) const {
  58. return pointer != it.pointer;
  59. }
  60. iterator& operator++() {
  61. if (pointer->right) {
  62. pointer = pointer->right;
  63. while (pointer->left) {
  64. pointer = pointer->left;
  65. }
  66. }
  67. else {
  68. Node<T>* before;
  69. do {
  70. before = pointer;
  71. pointer = pointer->parent;
  72. } while (pointer && before == pointer->right);
  73. }
  74. return *this;
  75. }
  76. iterator& operator++(int) {
  77. iterator old(*this);
  78. ++(*this);
  79. return old;
  80. }
  81. iterator& operator--() {
  82. if (pointer->left) {
  83. pointer = pointer->left;
  84. while (pointer->right) {
  85. pointer = pointer->right;
  86. }
  87. }
  88. else {
  89. Node<T>* before;
  90. do {
  91. before = pointer;
  92. pointer = pointer->parent;
  93. } while (pointer && before == pointer->left);
  94. }
  95. return *this;
  96. }
  97.  
  98. iterator operator--(int) {
  99. iterator old(*this);
  100. --(*this);
  101. return old;
  102. }
  103.  
  104.  
  105.  
  106. T& operator*() const {
  107. return pointer->value;
  108. }
  109. Node<T>* get_pointer() const {
  110. return pointer;
  111. }
  112.  
  113. };
  114.  
  115.  
  116. Node<T>* insert_private(Node<T>* node, const T& value);
  117. bool empty_private(Node<T>* node) {
  118. return node == nullptr ? true : false;
  119. }
  120. Node<T>* remove_min(Node<T>* node) {
  121. Node<T>* current = node;
  122. while (current->left != nullptr) {
  123. current = current->left;
  124. }
  125. return current;
  126. }
  127.  
  128. void clear(Node<T>* node) {
  129. if (node) {
  130. clear(node->left);
  131. clear(node->right);
  132. delete node;
  133. size_--;
  134. }
  135. }
  136. Node<T>* find_node(const T& value) {
  137. Node<T>** current = &node_;
  138. while (*current != nullptr) {
  139. if (value < (*current)->value) {
  140. current = &(*current)->left;
  141. }
  142. else if (value > (*current)->value) {
  143. current = &(*current)->right;
  144. }
  145. else {
  146. return *current;
  147. }
  148. }
  149. return nullptr;
  150. }
  151.  
  152.  
  153.  
  154. public:
  155. set() {
  156. this->node_ = nullptr;
  157. }
  158. ~set() {
  159. clear(node_);
  160. node_ = nullptr;
  161.  
  162. }
  163. template<typename It>
  164. set(It begin, It end) {
  165. for (auto it = begin; it != end; it++) {
  166. insert(*it);
  167. }
  168. }
  169. void remove_element(const T& value) {
  170. remove(this->node_, value);
  171. }
  172. void insert(const T& value) {
  173. node_ = insert_private(node_, value);
  174. }
  175.  
  176. void delete_node(const T& value) {
  177. Node<T>* node = find_node(value);
  178. Node<T>* node_par = node->parent;
  179. if (node_par->parent == nullptr && node_par->left == node) {
  180. clear(node);
  181. node_par->left = nullptr;
  182. }
  183. else if(node_par->parent == nullptr && node_par->right==node) {
  184. node_par->right = nullptr;
  185. }
  186. else {
  187. node_par->parent->left = nullptr;
  188. node_par->parent->right = nullptr;
  189. }
  190.  
  191. }
  192.  
  193. iterator min_element() {
  194. Node<T>* leftest = node_;
  195. while (leftest->left) {
  196. leftest = leftest->left;
  197. }
  198. return iterator(leftest);
  199. }
  200. iterator min_element() const {
  201. Node<T>* leftest = node_;
  202. while (leftest->left) {
  203. leftest = leftest->left;
  204. }
  205. return iterator(leftest);
  206. }
  207. iterator max_element() {
  208. Node<T>* rightest = node_;
  209. while (rightest->right) {
  210. rightest = rightest->right;
  211. }
  212. return iterator(rightest);
  213. }
  214. iterator max_element() const {
  215. Node<T>* rightest = node_;
  216. while (rightest->right) {
  217. rightest = rightest->right;
  218. }
  219. return iterator(rightest);
  220. }
  221. iterator begin() {
  222. return min_element();
  223. }
  224. iterator end() {
  225. return ++max_element();
  226. }
  227. iterator rbegin() {
  228. return max_element();
  229. }
  230. iterator rend() {
  231. return --min_element();
  232. }
  233. iterator begin() const {
  234. return min_element();
  235. }
  236. iterator end() const {
  237. return ++max_element();
  238. }
  239.  
  240. iterator find(const T& value) {
  241. Node<T>* node = node_;
  242. while (node) {
  243. if (value < node->value) {
  244. node = node->left;
  245. }
  246. else if (value > node->value) {
  247. node = node->right;
  248. }
  249. else {
  250. return iterator(node);
  251. }
  252. }
  253. return end();
  254. }
  255.  
  256. bool empty() {
  257. return empty_private(this->node_);
  258. }
  259.  
  260.  
  261. size_t size() {
  262. return size_;
  263. }
  264.  
  265. size_t count_lists() {
  266. size_t result = 0;
  267. for (auto x = begin(); x != end();x++) {
  268. if (x.get_pointer()->left == nullptr && x.get_pointer()->right == nullptr) {
  269. result++;
  270. }
  271. }
  272. return result;
  273. }
  274.  
  275.  
  276. void erase(iterator iter) {
  277. auto it = iter.get_pointer();
  278. if (it == nullptr) {
  279. throw std::invalid_argument("no element");
  280. }
  281. if (it->left == nullptr && it->right == nullptr) {
  282. if (it->parent->left == it) {
  283. it->parent->left = nullptr;
  284. }
  285. if(it->parent->right == it) {
  286. it->parent->right = nullptr;
  287. }
  288. Node<T>* temp = it;
  289. it = nullptr;
  290. delete temp;
  291. size_;
  292. return;
  293. }
  294. if (it->left == nullptr && it->right!=nullptr) {
  295. if (it->parent->left == it) {
  296. it->parent->left = it->right;
  297. it->right->parent = it->parent;
  298. }
  299. else if (it->parent->right == it) {
  300. it->parent->right = it->right;
  301. it->right->parent = it->parent;
  302. }
  303. Node<T>* temp = it;
  304. it = nullptr;
  305. delete temp;
  306. size_;
  307. return;
  308. }
  309. if (it->left != nullptr && it->right == nullptr) {
  310. if (it->parent->left == it) {
  311. it->parent->left = it->left;
  312. it->left->parent = it->parent;
  313. }
  314. else if (it->parent->right == it) {
  315. it->parent->right = it->left;
  316. it->left->parent = it->parent;
  317. }
  318. Node<T>* temp = it;
  319. it = nullptr;
  320. delete temp;
  321. size_;
  322. return;
  323. }
  324. if (it->left != nullptr && it->right != nullptr) {
  325. Node<T>* min=(++iter).get_pointer();
  326. it->value = min->value;
  327. erase(iterator(min));
  328.  
  329. }
  330. }
  331.  
  332. void PrintTree() {
  333. PrintTree_(node_, 0);
  334. }
  335.  
  336. private:
  337. void PrintTree_(Node<T>* node,int level) {
  338. std::string str=" ";
  339. if (node) {
  340. PrintTree_(node->left, level + 1);
  341. for (int i = 0; i < level; i++) { str = str + " "; }
  342. str += std::to_string(node->value);
  343. std::cout << str<<std::endl;
  344. PrintTree_(node->right, level + 1);
  345. }
  346. }
  347.  
  348.  
  349. Node<T>* node_;
  350. size_t size_;
  351. };
  352.  
  353. template<typename T>
  354. inline Node<T>* set<T>::insert_private(Node<T>* node, const T & value)
  355. {
  356. Node<T>** current = &node;
  357. Node<T>* parent = nullptr;
  358. while (*current != nullptr) {
  359. parent = *current;
  360. if (value < (*current)->value) {
  361. current = &(*current)->left;
  362. }
  363. else if (value > (*current)->value) {
  364. current = &(*current)->right;
  365. }
  366. else {
  367. return node;
  368. }
  369. }
  370. *current = new Node<T>(value, parent);
  371. (*current)->left = nullptr;
  372. (*current)->right = nullptr;
  373. size_++;
  374. return node;
  375. }
  376.  
  377. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement