shushus

Спринт 11. Умный указатель unique_ptr. Задание 2.

Mar 25th, 2023
441
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.08 KB | None | 0 0
  1. -----------------------------------------------------------------------
  2. tree.cpp
  3. -----------------------------------------------------------------------
  4. #include <cassert>
  5. #include <iostream>
  6. #include <memory>
  7.  
  8. template <typename T>
  9. struct TreeNode;
  10.  
  11. template <typename T>
  12. using TreeNodePtr = std::unique_ptr<TreeNode<T>>;
  13.  
  14. template <typename T>
  15. struct TreeNode {
  16.  
  17.     TreeNode(T val, TreeNodePtr<T>&& left, TreeNodePtr<T>&& right) : value(std::move(val))
  18.                                                                    , left(std::move(left))
  19.                                                                    , right(std::move(right)) {}
  20.  
  21.     T value;
  22.     TreeNodePtr<T> left;
  23.     TreeNodePtr<T> right;
  24.     TreeNode* parent = nullptr;
  25. };
  26.  
  27. template <typename T>
  28. bool CheckTreeProperty(const TreeNode<T>* node) noexcept {
  29.     if(node->parent){
  30.        
  31.         if (node->parent->left.get() != node) {
  32.             if (node->parent->value > node->value) {
  33.                 return false;
  34.             }
  35.         }
  36.        
  37.         if (node->parent->right.get() != node) {
  38.             if (node->parent->value < node->value) {
  39.                 return false;
  40.             }
  41.         }
  42.     }
  43.    
  44.     if (!(node->left.get()) && !(node->right.get())) {
  45.        
  46.         return true;
  47.        
  48.     } else if (node->left.get() && node->right.get()) {
  49.        
  50.         return CheckTreeProperty<T>(node->left.get()) &&
  51.                CheckTreeProperty<T>(node->right.get());
  52.        
  53.     } else if (!(node->left.get())) {
  54.        
  55.         return CheckTreeProperty<T>(node->right.get());
  56.        
  57.     } else {
  58.        
  59.         return CheckTreeProperty<T>(node->left.get());
  60.        
  61.     }
  62. }
  63.  
  64. template <typename T>
  65. TreeNode<T>* begin(TreeNode<T>* node) noexcept {
  66.    
  67.     while (node->left!=nullptr) {
  68.         node = node->left.get();
  69.     }
  70.    
  71.     return node;
  72. }
  73.  
  74. template <typename T>
  75. TreeNode<T>* next(TreeNode<T>* node) noexcept {
  76.    
  77.     if (node->right) {
  78.        
  79.         return begin(node->right.get());
  80.     }
  81.    
  82.     TreeNode<T>* _node = node->parent;
  83.    
  84.     while (_node && node == _node->right.get()) {
  85.         node = _node;
  86.         _node = _node->parent;
  87.     }
  88.    
  89.     return _node;
  90. }
  91.  
  92. TreeNodePtr<int> N(int val, TreeNodePtr<int>&& left = {}, TreeNodePtr<int>&& right = {}) {
  93.    
  94.     auto helper = new TreeNode<int>(val, std::move(left), std::move(right));
  95.     std::unique_ptr<TreeNode<int>> treenode_uniq{helper};
  96.    
  97.     if (treenode_uniq->left) {
  98.         treenode_uniq->left->parent = helper;
  99.     }
  100.    
  101.     if (treenode_uniq->right){
  102.         treenode_uniq->right->parent = helper;
  103.     }
  104.    
  105.     return treenode_uniq;
  106. }
  107.  
  108. int main() {
  109.     using namespace std;
  110.     using T = TreeNode<int>;
  111.     auto root1 = N(6, N(4, N(3), N(5)), N(7));
  112.     assert(CheckTreeProperty(root1.get()));
  113.  
  114.     T* iter = begin(root1.get());
  115.     while (iter) {
  116.         cout << iter->value << " "s;
  117.         iter = next(iter);
  118.     }
  119.     cout << endl;
  120.  
  121.     auto root2 = N(6, N(4, N(3), N(5)), N(7, N(8)));
  122.     assert(!CheckTreeProperty(root2.get()));
  123. }
Advertisement
Add Comment
Please, Sign In to add comment