Advertisement
OMEGAHEAD_MonkoX

Untitled

May 4th, 2023
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.36 KB | None | 0 0
  1. #ifndef __tree_HPP__
  2. #define __tree_HPP__
  3.  
  4. #include "tree_node.h"
  5.  
  6. using namespace std;
  7.  
  8. template <Comparable T>
  9. tree<T>::tree() noexcept
  10. {
  11. this->_size = 0;
  12. this->head = nullptr;
  13. }
  14.  
  15. template <Comparable T>
  16. template<Comparable U>
  17. requires Convertable<U, T>
  18. tree<T>::tree(tree<U> &tree)
  19. {
  20. this->_size = 0;
  21. this->head = nullptr;
  22.  
  23. for (auto el:tree)
  24. {
  25. insert(el);
  26. }
  27. }
  28.  
  29. template <Comparable T>
  30. tree<T>::tree(tree<T> &tree)
  31. {
  32. this->_size = 0;
  33. this->head = nullptr;
  34.  
  35. for (auto el:tree)
  36. {
  37. insert(el);
  38. }
  39. }
  40.  
  41. template <Comparable T>
  42. tree<T>::tree(tree<T> &&tree) noexcept
  43. {
  44. this->_size = tree.size();
  45. this->head = tree.head;
  46. }
  47.  
  48. template <Comparable T>
  49. template<Comparable U>
  50. requires Convertable<U, T>
  51. tree<T>::tree(const U &value)
  52. {
  53. insert(value);
  54. }
  55.  
  56.  
  57. template <Comparable T>
  58. template<input_iterator Iter>
  59. tree<T>::tree(const Iter &begin, const Iter &end)
  60. {
  61. for (auto iter = begin; iter != end; ++iter)
  62. {
  63. insert(*iter);
  64. }
  65. }
  66.  
  67. template <Comparable T>
  68. template<Comparable U>
  69. requires Convertable<U, T>
  70. tree<T>::tree(initializer_list<U> list)
  71. {
  72. if (list.size() == 0)
  73. {
  74. tree();
  75. return;
  76. }
  77.  
  78. for (auto &el:list)
  79. {
  80. insert(el);
  81. }
  82. }
  83.  
  84. template <Comparable T>
  85. template<Comparable U>
  86. requires Convertable<U, T>
  87. tree<T>::tree(const size_t &size, U const *arr)
  88. {
  89. for (size_t i = 0; i < size; ++i)
  90. {
  91. insert(arr[i]);
  92. }
  93. }
  94.  
  95. template <Comparable T>
  96. template <Container C>
  97. requires Convertable<typename C::value_type, T>
  98. tree<T>::tree(const C &container)
  99. {
  100. this->_size = container.size();
  101. for (auto iter:container)
  102. insert(iter);
  103. }
  104.  
  105. template<Comparable T>
  106. template <Container C>
  107. requires Convertable<typename C::value_type, T>
  108. tree<T> &tree<T>::operator = (const C &container)
  109. {
  110. this->_size = 0;
  111. this->head = nullptr;
  112. for (auto iter:container)
  113. {
  114. insert(iter);
  115. }
  116.  
  117. return *this;
  118. }
  119.  
  120. template<Comparable T>
  121. tree<T> &tree<T>::operator = (const tree<T> &tree)
  122. {
  123. this->_size = 0;
  124. this->head = nullptr;
  125.  
  126. for (auto iter:tree)
  127. {
  128. insert(iter);
  129. }
  130.  
  131. return *this;
  132. }
  133.  
  134. template<Comparable T>
  135. template<Comparable U>
  136. requires Convertable<U, T>
  137. tree<T> &tree<T>::operator = (initializer_list<U> list)
  138. {
  139. this->_size = 0;
  140. this->head = nullptr;
  141.  
  142. for (auto &el:list)
  143. {
  144. insert(el);
  145. }
  146.  
  147. return *this;
  148. }
  149.  
  150. template <Comparable T>
  151. tree<T> &tree<T>::operator = (tree<T> &&tree) noexcept
  152. {
  153. this->_size = tree.size();
  154. this->head = tree.head;
  155.  
  156. return *this;
  157. }
  158.  
  159. template <Comparable T>
  160. void tree<T>::set_size(int value) noexcept
  161. {
  162. this->_size = value;
  163. }
  164.  
  165. template <Comparable T>
  166. void tree<T>::reset_size() noexcept
  167. {
  168. this->_size = 0;
  169. }
  170.  
  171. template <Comparable T>
  172. size_t tree<T>::size() const noexcept
  173. {
  174. return this->_size;
  175. }
  176.  
  177. template <Comparable T>
  178. void tree<T>::increment_size() noexcept
  179. {
  180. this->_size++;
  181. }
  182.  
  183. template <Comparable T>
  184. void tree<T>::decrement_size() noexcept
  185. {
  186. this->_size--;
  187. }
  188.  
  189. template <Comparable T>
  190. bool tree<T>::insert(shared_ptr<tree_node<T>> node)
  191. {
  192. if (!head)
  193. {
  194. head = node;
  195. }
  196. else
  197. {
  198. shared_ptr<tree_node<T>> current = head;
  199. shared_ptr<tree_node<T>> parent;
  200.  
  201. while (current)
  202. {
  203. parent = current;
  204. if (node->get() < current->get())
  205. {
  206. current = current->get_left();
  207. }
  208. else if (node->get() > current->get())
  209. {
  210. current = current->get_right();
  211. }
  212. else
  213. {
  214. return false;
  215. }
  216. }
  217.  
  218. if (node->get() < parent->get())
  219. {
  220. parent->set_left(node);
  221. }
  222. else
  223. {
  224. parent->set_right(node);
  225. }
  226. }
  227.  
  228. increment_size();
  229.  
  230. return true;
  231. }
  232.  
  233. template <Comparable T>
  234. const optional<bst_iterator<T>> tree<T>::find(const T& value) const
  235. {
  236. shared_ptr<tree_node<T>> current = head;
  237.  
  238. while (current)
  239. {
  240. if (value == current->get())
  241. {
  242. optional<bst_iterator<T>> result(current);
  243. return result;
  244. }
  245. else if (value < current->get())
  246. {
  247. current = current->get_left();
  248. }
  249. else
  250. {
  251. current = current->get_right();
  252. }
  253. }
  254.  
  255. return nullopt;
  256. }
  257.  
  258. template <Comparable T>
  259. bool tree<T>::delete_node(const T& value)
  260. {
  261. shared_ptr<tree_node<T>> current = head;
  262. shared_ptr<tree_node<T>> parent = nullptr;
  263. bool found = false;
  264.  
  265. while (current && !found)
  266. {
  267. if (value == current->get())
  268. {
  269. found = true;
  270. }
  271. else if (value < current->get())
  272. {
  273. parent = current;
  274. current = current->get_left();
  275. }
  276. else
  277. {
  278. parent = current;
  279. current = current->get_right();
  280. }
  281. }
  282.  
  283. if (!current)
  284. {
  285. return false;
  286. }
  287.  
  288. if (!current->get_left() && !current->get_right())
  289. {
  290. if (!parent)
  291. {
  292. head = nullptr;
  293. }
  294. else if (current == parent->get_left())
  295. {
  296. parent->set_left(nullptr);
  297. }
  298. else
  299. {
  300. parent->set_right(nullptr);
  301. }
  302. }
  303. else if (!current->get_left() || !current->get_right())
  304. {
  305. shared_ptr<tree_node<T>> child = current->get_left() ? current->get_left() : current->get_right();
  306.  
  307. if (!parent)
  308. {
  309. head = child;
  310. }
  311. else if (current == parent->get_left())
  312. {
  313. parent->set_left(child);
  314. }
  315. else
  316. {
  317. parent->set_right(child);
  318. }
  319. }
  320. else
  321. {
  322. shared_ptr<tree_node<T>> min_node = current->get_right();
  323. shared_ptr<tree_node<T>> min_parent = current;
  324. while (min_node->get_left())
  325. {
  326. min_parent = min_node;
  327. min_node = min_node->get_left();
  328. }
  329. current->set(min_node->get());
  330. if (min_node == min_parent->get_left())
  331. {
  332. min_parent->set_left(min_node->get_right());
  333. }
  334. else
  335. {
  336. min_parent->set_right(min_node->get_right());
  337. }
  338. }
  339.  
  340. decrement_size();
  341.  
  342. return true;
  343. }
  344.  
  345. template <Comparable T>
  346. bool tree<T>::delete_node(bst_iterator<T> &iter)
  347. {
  348. return delete_node(*iter);
  349. }
  350.  
  351. template <Comparable T>
  352. template<Comparable U>
  353. requires Convertable<U, T>
  354. bool tree<T>::insert(const U& value)
  355. {
  356. shared_ptr<tree_node<T>> node = nullptr;
  357. try
  358. {
  359. node = shared_ptr<tree_node<T>>(new tree_node<T>(value));
  360. }
  361. catch (bad_alloc &error)
  362. {
  363. auto timenow = chrono::system_clock::to_time_t(chrono::system_clock::now());
  364. throw memory_error(ctime(&timenow), __FILE__, typeid(tree).name(), __FUNCTION__);
  365. }
  366.  
  367. return insert(node);
  368. }
  369.  
  370. template <Comparable T>
  371. template<Comparable U>
  372. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  373. tree<T> tree<T>::union_trees(const tree<U> &other) const
  374. {
  375. auto result = ::tree<Larger<T, U>>(*this);
  376.  
  377. for (auto el:other)
  378. {
  379. result.insert(el);
  380. }
  381.  
  382. return result;
  383. }
  384.  
  385. template <Comparable T>
  386. template<Comparable U>
  387. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  388. tree<T> tree<T>::intersection_trees(const tree<U> &other) const
  389. {
  390. auto result = ::tree<Larger<T, U>>(*this);
  391. for (bst_iterator<T> iter = begin(); iter != end(); ++iter)
  392. {
  393. T value = *iter;
  394. if (other.find(value).has_value())
  395. {
  396. result.insert(value);
  397. }
  398. }
  399.  
  400. return result;
  401. }
  402.  
  403. template <Comparable T>
  404. template<Comparable U>
  405. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  406. tree<T> tree<T>::difference_trees(const tree<U> &other) const
  407. {
  408. auto result = ::tree<Larger<T, U>>(*this);
  409. for (bst_iterator<T> iter = begin(); iter != end(); ++iter)
  410. {
  411. T value = *iter;
  412. if(!other.find(value).has_value())
  413. {
  414. result.insert(value);
  415. }
  416. }
  417.  
  418. return result;
  419. }
  420.  
  421. template <Comparable T>
  422. template<Comparable U>
  423. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  424. tree<T> tree<T>::symdifference_trees(const tree<U> &other) const
  425. {
  426. auto res1 = difference_trees(other);
  427. auto res2 = other.difference_trees(*this);
  428. auto res = res1.union_trees(res2);
  429.  
  430. return res;
  431. }
  432.  
  433. template <Comparable T>
  434. bool tree<T>::is_empty(void) const noexcept
  435. {
  436. return 0 == this->_size;
  437. }
  438.  
  439. template <Comparable T>
  440. void tree<T>::clear(void)
  441. {
  442. while (head)
  443. {
  444. delete_node(head->get());
  445. }
  446. }
  447.  
  448. template<Comparable T>
  449. template<Comparable U>
  450. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  451. tree<T> &tree<T>::merge(const tree<U> &tree) const
  452. {
  453. auto result = ::tree<Larger<T, U>>(*this);
  454. bool insert_code = true;
  455. for (auto el:tree)
  456. {
  457. insert_code = result.insert(el);
  458. if (!insert_code)
  459. {
  460. auto timenow = chrono::system_clock::to_time_t(chrono::system_clock::now());
  461. throw merge_error(ctime(&timenow), __FILE__, typeid(tree).name(), __FUNCTION__);
  462. }
  463. }
  464.  
  465. return result;
  466. }
  467.  
  468. template<Comparable T>
  469. template<Comparable U>
  470. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  471. tree<T> tree<T>::operator + (const tree<T> &tree) const
  472. {
  473. return merge(tree);
  474. }
  475.  
  476. template<Comparable T>
  477. template<Comparable U>
  478. requires Convertable<U, T>
  479. tree<T> &tree<T>::operator += (const tree<T> &tree)
  480. {
  481. bool insert_code = true;
  482. for (auto el:tree)
  483. {
  484. insert_code = insert(el);
  485. if (!insert_code)
  486. {
  487. auto timenow = chrono::system_clock::to_time_t(chrono::system_clock::now());
  488. throw merge_error(ctime(&timenow), __FILE__, typeid(tree).name(), __FUNCTION__);
  489. }
  490. }
  491.  
  492. return *this;
  493. }
  494.  
  495. template <Comparable T>
  496. bst_iterator<T> tree<T>::begin() const noexcept
  497. {
  498. return bst_iterator<T>(head);
  499. }
  500.  
  501. template <Comparable T>
  502. bst_iterator<T> tree<T>::end() const noexcept
  503. {
  504. return bst_iterator<T>(nullptr);
  505. }
  506.  
  507. template <Comparable T>
  508. reverse_bst_iterator<T> tree<T>::rbegin() const noexcept
  509. {
  510. return reverse_bst_iterator<T>(head);
  511. }
  512.  
  513. template <Comparable T>
  514. reverse_bst_iterator<T> tree<T>::rend() const noexcept
  515. {
  516. return reverse_bst_iterator<T>(nullptr);
  517. }
  518.  
  519. template <Comparable T>
  520. bool tree<T>::operator == (const tree<T> &tree) const noexcept
  521. {
  522. bool result = true;
  523. auto iter1 = begin();
  524. auto iter2 = tree.begin();
  525. for (; result && iter1 != end() && iter2 != tree.end(); ++iter1, ++iter2)
  526. {
  527. if (iter1 == end() || iter2 == tree.end())
  528. result = false;
  529.  
  530. if (*iter1 != *iter2)
  531. result = false;
  532. }
  533.  
  534. return result;
  535. }
  536.  
  537. template <Comparable T>
  538. bool tree<T>::operator != (const tree<T> &tree) const noexcept
  539. {
  540. return !(*this == tree);
  541. }
  542.  
  543. template <Comparable T>
  544. template<Comparable U>
  545. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  546. tree<T> tree<T>::operator | (const tree<U> &tree) const
  547. {
  548. return union_trees(tree);
  549. }
  550.  
  551. template <Comparable T>
  552. template<Comparable U>
  553. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  554. tree<T> tree<T>::operator / (const tree<U> &tree) const
  555. {
  556. return difference_trees(tree);
  557. }
  558.  
  559. template <Comparable T>
  560. template<Comparable U>
  561. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  562. tree<T> tree<T>::operator ^ (const tree<U> &tree) const
  563. {
  564. return symdifference_trees(tree);
  565. }
  566.  
  567. template <Comparable T>
  568. template<Comparable U>
  569. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  570. tree<T> tree<T>::operator & (const tree<U> &tree) const
  571. {
  572. return intersection_trees(tree);
  573. }
  574.  
  575. // template <Comparable T>
  576. // tree<T> tree<T>::operator + (const tree<T> &tree) const noexcept
  577. // {
  578. // return merge(tree);
  579. // }
  580.  
  581. // template <Comparable T>
  582. // tree<T> &tree<T>::operator += (const tree<T> &tree) noexcept
  583. // {
  584. // *this = merge(tree);
  585. // return *this;
  586. // }
  587.  
  588. template <Comparable T>
  589. tree<T> &tree<T>::operator |= (const tree<T> &tree)
  590. {
  591. *this = union_trees(tree);
  592. return *this;
  593. }
  594.  
  595. template <Comparable T>
  596. tree<T> &tree<T>::operator /= (const tree<T> &tree)
  597. {
  598. *this = difference_trees(tree);
  599. return *this;
  600. }
  601.  
  602. template <Comparable T>
  603. tree<T> &tree<T>::operator ^= (const tree<T> &tree)
  604. {
  605. *this = symdifference_trees(tree);
  606. return *this;
  607. }
  608.  
  609. template <Comparable T>
  610. tree<T> &tree<T>::operator &= (const tree<T> &tree)
  611. {
  612. *this = intersection_trees(tree);
  613. return *this;
  614. }
  615.  
  616. template <Comparable T>
  617. shared_ptr<tree_node<T>> tree<T>::get_head(void) const noexcept
  618. {
  619. return this->head;
  620. }
  621.  
  622. template <Comparable T>
  623. ostream& operator <<(ostream& os, const tree<T>& tree)
  624. {
  625. for (auto it:tree)
  626. {
  627. os << it << " ";
  628. }
  629. os << endl;
  630.  
  631. return os;
  632. }
  633.  
  634. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement