Advertisement
CyberN00b

m_tree

Jan 8th, 2023
792
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.93 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct TreeNode{
  6.  
  7.     long long int bro;
  8.     long long int left_son;
  9.     long long int parent;
  10.     long long int val;
  11.  
  12.     TreeNode(long long int val, long long int parent=-1) {
  13.         this->val = val;
  14.         this->parent = parent;
  15.         bro = -1;
  16.         left_son = -1;
  17.     }
  18.  
  19. };
  20.  
  21. struct Tree{
  22.  
  23.     Tree(string name) : tree_name(name) {}
  24.  
  25.     void insert(long long int val) {
  26.         if (tree_nodes.empty())
  27.             insert(-1, -1, val);
  28.         else
  29.             insert(0, -1, val);
  30.     }
  31.  
  32.     void equal_tree(Tree& b) {
  33.         for (long long int i = 0; i < tree_nodes.size(); ++i) {
  34.             if (!b.contains(tree_nodes[i]->val))
  35.                 delete_node(i);
  36.         }
  37.     }
  38.  
  39.     bool contains(long long int val) {
  40.         if (tree_nodes.empty())
  41.             return false;
  42.         return contains(0, val);
  43.     }
  44.  
  45.     void sym_print() {
  46.         if (tree_nodes.empty())
  47.             cout << tree_name << " tree is empty!";
  48.         else {
  49.             cout << tree_name << " tree: ";
  50.             sym_print(0);
  51.         }
  52.         cout << endl;
  53.     }
  54.  
  55.     void str_print() {
  56.         if (tree_nodes.empty())
  57.             cout << tree_name << " tree is empty!";
  58.         else {
  59.             cout << tree_name << " tree: ";
  60.             str_print(0);
  61.         }
  62.         cout << endl;
  63.     }
  64.  
  65. private:
  66.  
  67.     void delete_node(long long int index) {
  68.         if (index == -1)
  69.             return;
  70.         long long int l = left_son(index), r = right_son(index);
  71.         if (l == -1 && r == -1) {
  72.             if (tree_nodes[index]->parent != -1) {
  73.                 if (is_right(tree_nodes[index]->parent, tree_nodes[index]->val)) {
  74.                     if (tree_nodes[tree_nodes[index]->parent]->left_son != -1)
  75.                         tree_nodes[tree_nodes[tree_nodes[index]->parent]->left_son]->bro = -1;
  76.                 } else
  77.                     tree_nodes[tree_nodes[index]->parent]->left_son = -1;
  78.             }
  79.             deleting_node(index);
  80.         } else if (r == -1) {
  81.             tree_nodes[l]->parent = tree_nodes[index]->parent;
  82.             tree_nodes[l]->bro = tree_nodes[index]->bro;
  83.             if (tree_nodes[index]->parent != -1) {
  84.                 if (is_right(tree_nodes[index]->parent, tree_nodes[index]->val)) {
  85.                     if (tree_nodes[tree_nodes[index]->parent]->left_son != -1)
  86.                         tree_nodes[tree_nodes[tree_nodes[index]->parent]->left_son]->bro = l;
  87.                 } else {
  88.                     tree_nodes[tree_nodes[index]->parent]->left_son = l;
  89.                 }
  90.             }
  91.             deleting_node(index);
  92.         } else if (l == -1) {
  93.             tree_nodes[r]->parent = tree_nodes[index]->parent;
  94.             tree_nodes[r]->bro = tree_nodes[index]->bro;
  95.             if (tree_nodes[index]->parent != -1) {
  96.                 if (is_right(tree_nodes[index]->parent, tree_nodes[index]->val)) {
  97.                     if (tree_nodes[tree_nodes[index]->parent]->left_son != -1)
  98.                         tree_nodes[tree_nodes[tree_nodes[index]->parent]->left_son]->bro = r;
  99.                 } else {
  100.                     tree_nodes[tree_nodes[index]->parent]->left_son = r;
  101.                 }
  102.             }
  103.             deleting_node(index);
  104.         } else {
  105.             tree_nodes[index]->val = del_left(right_son(index));
  106.         }
  107.     }
  108.  
  109.     long long int del_left(long long index) {
  110.         while (tree_nodes[index]->left_son != -1)
  111.             index = tree_nodes[index]->left_son;
  112.         long long int tmp = tree_nodes[index]->val, r = right_son(index);
  113.         if (r != -1) {
  114.             tree_nodes[r]->parent = tree_nodes[index]->parent;
  115.             if (!is_right(tree_nodes[index]->parent, tree_nodes[index]->val)) {
  116.                 tree_nodes[tree_nodes[index]->parent]->left_son = r;
  117.             } else {
  118.                 long long int l = left_son(tree_nodes[index]->parent);
  119.                 if (l != -1)
  120.                     tree_nodes[l]->bro = r;
  121.             }
  122.         } else {
  123.             if (!is_right(tree_nodes[index]->parent, tree_nodes[index]->val)) {
  124.                 tree_nodes[tree_nodes[index]->parent]->left_son = -1;
  125.             } else {
  126.                 long long int l = left_son(tree_nodes[index]->parent);
  127.                 if (l != -1)
  128.                     tree_nodes[l]->bro = -1;
  129.             }
  130.         }
  131.         deleting_node(index);
  132.         return tmp;
  133.     }
  134.  
  135.     void deleting_node(long long int index) {
  136.         tree_nodes.erase(tree_nodes.begin() + index);
  137.         for (auto& x : tree_nodes) {
  138.             if (x->parent > index)
  139.                 --x->parent;
  140.             if (x->left_son > index)
  141.                 --x->left_son;
  142.             if (x->bro > index)
  143.                 --x->bro;
  144.         }
  145.     }
  146.  
  147.     void sym_print(long long int index) {
  148.         if (index == -1)
  149.             return;
  150.         sym_print(left_son(index));
  151.         cout << tree_nodes[index]->val << ' ';
  152.         sym_print(right_son(index));
  153.     }
  154.  
  155.     void str_print(long long int index) {
  156.         if (index == -1)
  157.             return;
  158.         cout << tree_nodes[index]->val << ' ';
  159.         str_print(left_son(index));
  160.         str_print(right_son(index));
  161.     }
  162.  
  163.     void insert(long long int index, long long int parent, long long int val) {
  164.         if (index == -1) {
  165.             tree_nodes.push_back(new TreeNode(val, parent));
  166.             check_node(tree_nodes.size() - 1);
  167.             return;
  168.         }
  169.         if (val > tree_nodes[index]->val) {
  170.             insert(right_son(index), index, val);
  171.         } else {
  172.             insert(left_son(index), index, val);
  173.         }
  174.     }
  175.  
  176.     bool contains(long long int index, long long int val) {
  177.         if (index == -1)
  178.             return false;
  179.         if (val == tree_nodes[index]->val)
  180.             return true;
  181.         if (tree_nodes[index]->val < val) {
  182.             return contains(right_son(index), val);
  183.         }
  184.         return contains(left_son(index), val);
  185.     }
  186.  
  187.     void check_node(long long int index) {
  188.         long long int parent = tree_nodes[index]->parent;
  189.         if (parent != -1)
  190.             if (is_right(parent, tree_nodes[index]->val)) {
  191.                 if (tree_nodes[parent]->left_son != -1)
  192.                     tree_nodes[tree_nodes[parent]->left_son]->bro = index;
  193.             } else {
  194.                 tree_nodes[parent]->left_son = index;
  195.                 for (long long int i = parent + 1; i < tree_nodes.size(); ++i) {
  196.                     if (i == index)
  197.                         continue;
  198.                     if (tree_nodes[i]->parent == parent) {
  199.                         tree_nodes[index]->bro = i;
  200.                         break;
  201.                     }
  202.                 }
  203.             }
  204.     }
  205.  
  206.     long long int left_son(long long int index) {
  207.         return tree_nodes[index]->left_son;
  208.     }
  209.  
  210.     long long int right_son(long long int index) {
  211.         if (tree_nodes[index]->left_son != -1)
  212.             return tree_nodes[tree_nodes[index]->left_son]->bro;
  213.         for (long long int i = index + 1; i < tree_nodes.size(); ++i) {
  214.             if (tree_nodes[i]->parent == index)
  215.                 return i;
  216.         }
  217.         return -1;
  218.     }
  219.  
  220.     bool is_right(long long int parent_index, long long int val) {
  221.         return tree_nodes[parent_index]->val < val;
  222.     }
  223.  
  224.     string tree_name;
  225.     vector<TreeNode*> tree_nodes;
  226. };
  227.  
  228. int main() {
  229.     int a;
  230.     Tree A("A"), B("B");
  231.     cout << "Enter count of elements in A tree: ";
  232.     cin >> a;
  233.     for (int i = 0; i < a; ++i) {
  234.         int t;
  235.         cout << "Enter " << i + 1 << " element: ";
  236.         cin >> t;
  237.         A.insert(t);
  238.     }
  239.     A.str_print();
  240.     cout << "Enter count of elements in B tree: ";
  241.     cin >> a;
  242.     for (int i = 0; i < a; ++i) {
  243.         int t;
  244.         cout << "Enter " << i + 1 << " element: ";
  245.         cin >> t;
  246.         B.insert(t);
  247.     }
  248.     B.sym_print();
  249.     A.equal_tree(B);
  250.     cout << "After operation:\n";
  251.     A.str_print();
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement