Advertisement
CyberN00b

tree

Jan 7th, 2023 (edited)
852
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.40 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct Node{
  6.  
  7.     long long int value;
  8.     long long size;
  9.  
  10.     void fix_size() {
  11.         size = 1;
  12.         for (auto& x : sons)
  13.             if (x != nullptr)
  14.                 size += x->size;
  15.     }
  16.  
  17.     Node*& left_son() {
  18.         return sons[0];
  19.     }
  20.  
  21.     Node*& right_son() {
  22.         return sons[1];
  23.     }
  24.  
  25.     Node(long long value) : value(value), size(1), sons({nullptr, nullptr}) {}
  26.  
  27. private:
  28.  
  29.     vector<Node*> sons;
  30.  
  31. };
  32.  
  33. struct Tree {
  34.  
  35.     Tree() {
  36.         srand(time(NULL));
  37.         root = nullptr;
  38.     }
  39.  
  40.     void insert(long long int value) {
  41.         insert(root, value);
  42.     }
  43.  
  44.     bool contains(long long int value) {
  45.         return contains(root, value);
  46.     }
  47.  
  48.     void add_tree(Tree& tree) {
  49.         add_tree(tree.root);
  50.     }
  51.  
  52.     string str_tree() {
  53.         if (root == nullptr)
  54.             return "tree is empty!";
  55.         string s = "tree: ";
  56.         str_tree(root, s);
  57.         return s;
  58.     }
  59.  
  60.     string sym_tree() {
  61.         if (root == nullptr)
  62.             return "tree is empty!";
  63.         string s = "tree: ";
  64.         sym_tree(root, s);
  65.         return s;
  66.     }
  67.  
  68. private:
  69.  
  70.     void add_tree(Node*& node) {
  71.         if (node == nullptr)
  72.             return;
  73.         add_tree(node->left_son());
  74.         add_tree(node->right_son());
  75.         insert(root, node->value);
  76.     }
  77.  
  78.     void str_tree(Node*& node, string& s) {
  79.         if (node == nullptr)
  80.             return;
  81.         s += to_string(node->value) + " ";
  82.         str_tree(node->left_son(), s);
  83.         str_tree(node->right_son(), s);
  84.     }
  85.  
  86.     void sym_tree(Node*& node, string& s) {
  87.         if (node == nullptr)
  88.             return;
  89.         sym_tree(node->left_son(), s);
  90.         s += to_string(node->value) + " ";
  91.         sym_tree(node->right_son(), s);
  92.     }
  93.  
  94.     bool contains(Node*& node, long long int value) {
  95.         if (node == nullptr)
  96.             return false;
  97.         if (node->value == value)
  98.             return true;
  99.         return contains(node->left_son(), value) || contains(node->right_son(), value);
  100.     }
  101.  
  102.     void insert(Node*& node, long long int value) {
  103.         if (node == nullptr) {
  104.             node = new Node(value);
  105.             return;
  106.         }
  107.         if (rand() % (node->size + 1) == 0) {
  108.             insert_root(node, value);
  109.             node->fix_size();
  110.         } else {
  111.             if (value > node->value)
  112.                 insert(node->right_son(), value);
  113.             else
  114.                 insert(node->left_son(), value);
  115.             node->fix_size();
  116.         }
  117.     }
  118.  
  119.     void insert_root(Node*& p, long long int value) // вставка нового узла с ключом value в корень дерева p
  120.     {
  121.         if (p == nullptr) {
  122.             p = new Node(value);
  123.             return;
  124.         }
  125.         if (value < p->value)
  126.         {
  127.             insert_root(p->left_son(), value);
  128.             rotate_right(p);
  129.         }
  130.         else
  131.         {
  132.             insert_root(p->right_son(), value);
  133.             rotate_left(p);
  134.         }
  135.     }
  136.  
  137.     void rotate_right(Node*& p)
  138.     {
  139.         Node* q = p->left_son();
  140.         if (q == nullptr) {
  141.             delete p;
  142.             p = nullptr;
  143.             return;
  144.         }
  145.         p->left_son() = q->right_son();
  146.         q->right_son() = p;
  147.         q->size = p->size;
  148.         p->fix_size();
  149.         p = q;
  150.     }
  151.  
  152.     void rotate_left(Node*& q)
  153.     {
  154.         Node* p = q->right_son();
  155.         if (p == nullptr) {
  156.             delete q;
  157.             q = nullptr;
  158.             return;
  159.         }
  160.         q->right_son() = p->left_son();
  161.         p->left_son() = q;
  162.         p->size = q->size;
  163.         q->fix_size();
  164.         q = p;
  165.     }
  166.  
  167.     Node* root;
  168.  
  169. };
  170.  
  171. int main() {
  172.     int a;
  173.     cout << "Enter count of elements in A tree: ";
  174.     cin >> a;
  175.     Tree A, B;
  176.     for (int i = 0; i < a; ++i) {
  177.         int tmp;
  178.         cout << "Enter element " << i + 1 << ": ";
  179.         cin >> tmp;
  180.         A.insert(tmp);
  181.     }
  182.     cout << "A " << A.str_tree() << '\n';
  183.     cout << "Enter count of elements in B tree: ";
  184.     cin >> a;
  185.     for (int i = 0; i < a; ++i) {
  186.         int tmp;
  187.         cout << "Enter element " << i + 1 << ": ";
  188.         cin >> tmp;
  189.         B.insert(tmp);
  190.     }
  191.     cout << "B " << B.sym_tree() << '\n';
  192.     A.add_tree(B);
  193.     cout << "After operation\n";
  194.     cout << "A " << A.str_tree() << '\n';
  195. }
  196.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement