AlexSSH

Untitled

Mar 1st, 2023
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 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.     if (!node->left) return node;
  52.     return begin(node->left);
  53. }
  54.  
  55. template<class T>
  56. TreeNode<T> *next(TreeNode<T> *node) {
  57.     if (node->right) return begin(node->right);
  58.     auto current = node;
  59.     while (current->parent->left != current) {
  60.         if (current->parent) current = current->parent;
  61.         else return nullptr;
  62.     }
  63.     return current->parent;
  64. }
  65.  
  66. // функция создаёт новый узел с заданным значением и потомками
  67. TreeNode<int> *N(int val, TreeNode<int> *left = nullptr, TreeNode<int> *right = nullptr) {
  68.     auto res = new TreeNode<int>{val, nullptr, left, right};
  69.     if (left) {
  70.         left->parent = res;
  71.     }
  72.     if (right) {
  73.         right->parent = res;
  74.     }
  75.  
  76.     return res;
  77. }
  78.  
  79. template<typename T>
  80. bool CheckTreeProperty(const TreeNode<T> *node, const T *min, const T *max) {
  81.     if (!node) return true;
  82.     if (min && node->value < *min) return false;
  83.     if (max && node->value > *max) return false;
  84.     return CheckTreeProperty(node->left, min, &node->value) && CheckTreeProperty<T>(node->right, &node->value, max);
  85. }
  86.  
  87. template<typename T>
  88. bool CheckTreeProperty(const TreeNode<T> *node) {
  89.     return CheckTreeProperty<T>(node, nullptr, nullptr);
  90. }
  91.  
  92. int main() {
  93.     using T = TreeNode<int>;
  94.  
  95.     T *root = N(6, N(4, N(3), N(5)), N(8, N(7)));
  96.     cout << root << endl;
  97.  
  98.     T *iter = begin(root);
  99.  
  100.     while (iter) {
  101.         cout << iter->value << " "s;
  102.         iter = next(iter);
  103.     }
  104.     cout << endl;
  105.  
  106.     DeleteTree(root);
  107. }
Advertisement
Add Comment
Please, Sign In to add comment