Advertisement
kutuzzzov

Урок 2-2 умный указатель

Mar 28th, 2023
1,243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.34 KB | None | 0 0
  1. #include <cassert>
  2. #include <iostream>
  3. #include <memory>
  4.  
  5. template <typename T>
  6. struct TreeNode;
  7.  
  8. template <typename T>
  9. using TreeNodePtr = std::unique_ptr<TreeNode<T>>;
  10.  
  11. template <typename T>
  12. struct TreeNode {
  13.     TreeNode(T val, TreeNodePtr<T>&& left, TreeNodePtr<T>&& right)
  14.         : value(std::move(val))
  15.         , left(std::move(left))
  16.         , right(std::move(right)) {
  17.     }
  18.  
  19.     T value;
  20.     TreeNodePtr<T> left;
  21.     TreeNodePtr<T> right;
  22.     TreeNode* parent = nullptr;
  23. };
  24.  
  25. template <typename T>
  26. bool CheckTreeProperty(const TreeNode<T>* node) noexcept {
  27.      int leftznac = 0;
  28.     int rightznac = 0;
  29.  
  30.     // return if the tree is empty
  31.        if (node == nullptr) {
  32.            return true;
  33.        }
  34.  
  35.     auto left  = node->left.get();
  36.     if (left) {
  37.         leftznac = left->value;
  38.     if (leftznac > node->value || !CheckTreeProperty(left)) {
  39.         return false;
  40.     }
  41.     }
  42.     auto right = node->right.get();
  43.  
  44.     if (right) {
  45.         rightznac = right->value;
  46.         if (rightznac < node->value || !CheckTreeProperty(right)) {
  47.             return false;
  48.     }
  49.      }
  50.     return true;
  51.  
  52.   }
  53.  
  54.  
  55.  
  56. template <typename T>
  57. TreeNode<T>* begin(TreeNode<T>* node) noexcept {
  58.     if (node != nullptr){
  59.  
  60.     while (node->left.get()){
  61.         node =node->left.get();
  62.     }
  63.     return node;
  64.   }
  65.   return nullptr;
  66.  
  67.  
  68. //    while(node->left) {
  69. //          node = node->left;
  70. //      }
  71. //      return node;
  72.  
  73. }
  74.  
  75. template <typename T>
  76. TreeNode<T>* next(TreeNode<T>* node) noexcept {
  77.     if (node->right != nullptr) {
  78.         node = node->right.get();
  79.         while (node->left != nullptr) {
  80.             node = node->left.get();
  81.         }
  82.     }
  83.     else {
  84.         if(node->parent == nullptr) return nullptr;
  85.         while (node->parent != nullptr) {
  86.  
  87.             if (node->parent->right.get() == node) {
  88.                 node = node->parent;
  89.                 if (node->parent == nullptr) {
  90.                     return nullptr;
  91.                 }
  92.             }
  93.             else {
  94.                 return node->parent;
  95.             }
  96.         }
  97.     }
  98.     return node;
  99. }
  100.  
  101.  
  102. // функция создаёт новый узел с заданным значением и потомками
  103. TreeNodePtr<int> N(int val, TreeNodePtr<int>&& left = {}, TreeNodePtr<int>&& right = {}) {
  104.  
  105.  
  106.     auto new_node =  TreeNode<int>({std::move(val), std::move(left), std::move(right)});
  107.  
  108.  
  109.     auto result = std::make_unique<TreeNode<int>>(std::move(new_node));
  110.  
  111.     auto z = result.get();
  112.  
  113.  
  114.     if (z->left.get()) {
  115.         auto l = z->left.get();
  116.        l->parent = z;
  117.     }
  118.     if (z->right.get()) {
  119.         auto r = z->right.get();
  120.        r->parent = z;
  121.      }
  122.  
  123.  
  124.     return result;
  125.  
  126.  
  127.  
  128.  
  129.  
  130. }
  131.  
  132. int main() {
  133.     using namespace std;
  134.     using T = TreeNode<int>;
  135.     auto root1 = N(6, N(4, N(3), N(5)), N(7));
  136.  
  137.     assert(CheckTreeProperty(root1.get()));
  138.  
  139.     T* iter = begin(root1.get());
  140.     while (iter) {
  141.         cout << iter->value << " "s;
  142.         iter = next(iter);
  143.         cout << endl;
  144.     }
  145.     cout << endl;
  146.  
  147.     auto root2 = N(6, N(4, N(3), N(5)), N(7, N(8)));
  148.     assert(!CheckTreeProperty(root2.get()));
  149.  
  150.     // Функция DeleteTree не нужна. Узлы дерева будут рекурсивно удалены
  151.     // благодаря деструкторам unique_ptr
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement