shushus

Спринт 10. Галопом по map'ам и set'ам.

Mar 8th, 2023
329
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.45 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3.  
  4. using namespace std;
  5.  
  6. template <class 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.  
  52.     if (node) {
  53.         while (node->left) {
  54.             node = node->left;
  55.         }
  56.     }
  57.    
  58.     return node;
  59. }
  60.  
  61. template <class T>
  62. TreeNode<T>* next(TreeNode<T>* node) {
  63.    
  64.     if (node) {
  65.        
  66.         if (!node->right) {
  67.             bool node_left_pos = (node == node->parent->left);
  68.            
  69.             if (node_left_pos) {
  70.                 node = node->parent;
  71.                
  72.             } else {
  73.                 bool right = (node->parent && node == node->parent->right);
  74.                 while (right) {
  75.                     node = node->parent;
  76.                     right = (node->parent && node == node->parent->right);
  77.                    
  78.                 }
  79.                 node = node->parent;
  80.                
  81.             }
  82.         } else {
  83.             node = begin(node->right);
  84.         }
  85.     }
  86.    
  87.     return node;
  88. }
  89.  
  90. TreeNode<int>* N(int val, TreeNode<int>* left = nullptr, TreeNode<int>* right = nullptr) {
  91.     auto res = new TreeNode<int>{val, nullptr, left, right};
  92.     if (left) {
  93.         left->parent = res;
  94.     }
  95.     if (right) {
  96.         right->parent = res;
  97.     }
  98.  
  99.     return res;
  100. }
  101.  
  102. int main() {
  103.     using T = TreeNode<int>;
  104.  
  105.     T* root = N(6, N(4, N(3), N(5)), N(8, N(7)));
  106.     cout << root << endl;
  107.  
  108.     T* iter = begin(root);
  109.  
  110.     while (iter) {
  111.         cout << iter->value << " "s;
  112.         iter = next(iter);
  113.     }
  114.     cout << endl;
  115.  
  116.     DeleteTree(root);
  117. }
Advertisement
Add Comment
Please, Sign In to add comment