Advertisement
RobertDeMilo

2guduz

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