Advertisement
AlexNovoross87

Unique_ptr

Nov 11th, 2024
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.13 KB | Software | 0 0
  1. #include <cassert>
  2. #include <iostream>
  3. #include <memory>
  4. #include <boost/asio.hpp>
  5. #include <boost/algorithm/string/trim.hpp>
  6.  
  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.     TreeNode(T val, TreeNodePtr<T> l ={}, TreeNodePtr<T>&& r = {})
  17.     // Используйте TreeNodePtr<T> вместо сырых указателей.
  18.     // Примите умные указатели по rvalue-ссылке.
  19.         : value(std::move(val))
  20.         , left(std::move(l))
  21.         , right(std::move(r)) {}
  22.  
  23.     T value;
  24.     TreeNodePtr<T> left;  // Замените TreeNode* на TreeNodePtr<T>
  25.     TreeNodePtr<T> right; // Замените TreeNode* на TreeNodePtr<T>
  26.  
  27.     // parent оставьте обычным указателем, иначе возникнет
  28.     // кольцевая зависимость.
  29.     TreeNode* parent = nullptr;
  30. };
  31.  
  32. template <typename T>
  33. bool CheckTreeProperty(const TreeNode<T>* node, const T* min, const T* max) noexcept {
  34.     if (!node) {
  35.         return true;
  36.     }
  37.     if ((min && node->value <= *min) || (max && node->value >= *max)) {
  38.         return false;
  39.     }
  40.  
  41.    
  42.    
  43.     return CheckTreeProperty(node->left.get(), min, &node->value)
  44.            && CheckTreeProperty(node->right.get(), &node->value, max);
  45. }
  46.  
  47. template <class T>
  48. bool CheckTreeProperty(const TreeNode<T>* node) noexcept {
  49.     return CheckTreeProperty<T>(node, nullptr, nullptr);
  50. }
  51.  
  52.  
  53. template <typename T>
  54. TreeNode<T>* begin(TreeNode<T>* node) noexcept {
  55.     while (node->left) {
  56.         node = node->left.get();
  57.     }
  58.  
  59.     return node;
  60. }
  61.  
  62. template <typename T>
  63. TreeNode<T>* next(TreeNode<T>* node) noexcept {
  64.     if (node->right) {
  65.         return begin(node->right.get());
  66.     }
  67.     while (node->parent) {
  68.         bool is_right = (node == node->parent->right.get());
  69.         if (!is_right) {
  70.             return node->parent;
  71.         }
  72.         node = node->parent;
  73.     }
  74.  
  75.     return nullptr;
  76. }
  77.  
  78. // Замените указатели на умные. Сигнатура функции должна стать такой:
  79. // TreeNodePtr<int> N(int val, TreeNodePtr<int>&& left = {}, TreeNodePtr<int>&& right = {})
  80. TreeNodePtr<int> N(int val, TreeNodePtr<int>&& l = {}, TreeNodePtr<int>&& r = {}) {
  81.     auto node = std::make_unique<TreeNode<int>> (val, std::move(l), std::move(r));
  82.     if (node->left) {
  83.         node->left->parent = node.get();
  84.     }
  85.     if (node->right) {
  86.         node->right->parent = node.get();
  87.     }
  88.     return node;
  89. }
  90.  
  91.  
  92.  
  93. int main() {
  94.     using namespace std;
  95.     using T = TreeNode<int>;
  96.  
  97.    
  98.     auto root1 = N(6, N(4, N(3), N(5)), N(7));
  99.     assert(CheckTreeProperty(root1.get()));
  100.  
  101.     T* iter = begin(root1.get());
  102.     while (iter) {
  103.         cout << iter->value << " "s;
  104.         iter = next(iter);
  105.     }
  106.     cout << endl;
  107.  
  108.     auto root2 = N(6, N(4, N(3), N(5)), N(7, N(8)));
  109.     assert(!CheckTreeProperty(root2.get()));
  110.  
  111.     std::string str = "          hshshshshs      \n     ";
  112.     boost::algorithm::trim(str);
  113.     std::cout<<"-"<<str<<"-";
  114.  
  115.  
  116. }
Tags: unique_ptr
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement