AlexSSH

Untitled

Mar 1st, 2023
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 KB | None | 0 0
  1. #include <cassert>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. template<typename T>
  7. struct TreeNode {
  8.     T value;
  9.     TreeNode *parent = nullptr;
  10.     TreeNode *left = nullptr;
  11.     TreeNode *right = nullptr;
  12. };
  13.  
  14. template<class T>
  15. void DeleteTree(TreeNode<T> *node) {
  16.     if (!node) {
  17.         return;
  18.     }
  19.     DeleteTree(node->left);
  20.     DeleteTree(node->right);
  21.     delete node;
  22. }
  23.  
  24. template<class T>
  25. void PrintTree(const TreeNode<T> *root, ostream &out = cout) {
  26.     out << " ( "s;
  27.     out << root->value;
  28.     if (root->left || root->right) {
  29.         if (root->left) {
  30.             PrintTree(root->left, out);
  31.         } else {
  32.             out << "*"s;
  33.         }
  34.         if (root->right) {
  35.             PrintTree(root->right, out);
  36.         } else {
  37.             out << "*"s;
  38.         }
  39.     }
  40.     out << " ) "s;
  41. }
  42.  
  43. template<class T>
  44. ostream &operator<<(ostream &out, const TreeNode<T> *node) {
  45.     PrintTree(node, out);
  46.     return out;
  47. }
  48.  
  49. template<class T>
  50. TreeNode<T> *begin(TreeNode<T> *node) {
  51.     auto tmp = node;
  52.     while (tmp->left) tmp = tmp->left;
  53.     return tmp;
  54. }
  55.  
  56. template<class T>
  57. TreeNode<T> *next(TreeNode<T> *node) {
  58.     if (node->right) return begin(node->right);
  59.     auto current = node;
  60.     while (current->parent->left != current) {
  61.         if (current->parent) current = current->parent;
  62.         else return nullptr;
  63.     }
  64.     return current->parent;
  65. }
  66.  
  67. // функция создаёт новый узел с заданным значением и потомками
  68. TreeNode<int> *N(int val, TreeNode<int> *left = nullptr, TreeNode<int> *right = nullptr) {
  69.     auto res = new TreeNode<int>{val, nullptr, left, right};
  70.     if (left) {
  71.         left->parent = res;
  72.     }
  73.     if (right) {
  74.         right->parent = res;
  75.     }
  76.  
  77.     return res;
  78. }
  79.  
  80. template<typename T>
  81. bool CheckTreeProperty(const TreeNode<T> *node, const T *min, const T *max) {
  82.     if (!node) return true;
  83.     if (min && node->value < *min) return false;
  84.     if (max && node->value > *max) return false;
  85.     return CheckTreeProperty(node->left, min, &node->value) && CheckTreeProperty<T>(node->right, &node->value, max);
  86. }
  87.  
  88. template<typename T>
  89. bool CheckTreeProperty(const TreeNode<T> *node) {
  90.     return CheckTreeProperty<T>(node, nullptr, nullptr);
  91. }
  92.  
  93. int main() {
  94.     using T = TreeNode<int>;
  95.  
  96.     T *root = N(1, nullptr, N(2, nullptr, N(3, nullptr, N(4))));
  97.     cout << root << endl;
  98.  
  99.     T *iter = begin(root);
  100.  
  101.     while (iter) {
  102.         cout << iter->value << " "s;
  103.         iter = next(iter);
  104.     }
  105.     cout << endl;
  106.  
  107.     DeleteTree(root);
  108. }
Advertisement
Add Comment
Please, Sign In to add comment