Advertisement
Alex_St

Binary Search Tree

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