Advertisement
hpnq

AVL merge

May 19th, 2024 (edited)
629
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.02 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2. //speed coding handle
  3.  
  4. #define mp make_pair
  5. #define cve(tpy) for (auto i : tpy) {for(auto j : i){cout << j << " ";  }cout << "\n";} ;
  6. #define f first
  7. #define s second
  8. #define loop(i, x, n) for (int i = x; i < n; i++)
  9. #define joop(x, n) for (ll j = x; j < n; j++)
  10. #define lp(n) for (ll i = 0; i < n; i++)
  11. #define err cout << "ERROR" << endl;
  12. #define all(x) x.begin(), x.end()
  13. #define pb push_back
  14. #define sz(x) x.size()
  15. #define rndm rng()
  16.  
  17. // types
  18. #define pii pair<int, int>
  19. #define pll pair<ll, ll>
  20. #define vvi vector<vector<int>>
  21. #define vvll vector<vector<ll>>
  22. typedef long long ll;
  23. typedef long double ld;
  24.  
  25. // types of data
  26. #define inf 1000000000
  27. #define infll 1000000000000000000
  28. #define INF ll(1e18)
  29.  
  30. #define md 998244353
  31. #define mod 1000000009
  32. //#define K 239017
  33.  
  34. #define DEBUG 1
  35. using namespace std;
  36. mt19937_64 rng(113113);
  37. uniform_int_distribution<ll> drist;
  38.  
  39. struct node // структура для представления узлов дерева
  40. {
  41.     int info;//значение
  42.     node *left;//ссылка на левое поддерево
  43.     node *right;//ссылка на правое поддерево
  44.     int balance; // поле баланса= высота правого поддерева - высота левого поддерева
  45. };
  46.  
  47.  
  48. int Height(node *root)// вычисляет высоту дерева
  49. {
  50.     if (root == nullptr) return 0;//если дерево пусто возвращаем 0
  51.     //иначе
  52.     int hLeft = Height(root->left),//считаем высоту левого поддерева
  53.     hRight = Height(root->right); //считаем высоту правого поддерева
  54.     return max(hLeft, hRight) + 1;
  55.  
  56. }
  57.  
  58. void SetBalance(node *(&root))//нахождение значение баланса для текущего узла
  59. {
  60.     if (root != nullptr)
  61.         root->balance = Height(root->right) - Height(root->left);
  62. }
  63.  
  64. void TurnLeft(node *(&root))//левый поворот АВЛ-дерева
  65. {
  66.     node *rightSubtree, *rightSubtreeLeftSubtree;
  67.     rightSubtree = root->right;
  68.     rightSubtreeLeftSubtree = rightSubtree->left;
  69.  
  70.     rightSubtree->left = root;
  71.     root->right = rightSubtreeLeftSubtree;
  72.     root = rightSubtree;
  73.     SetBalance(root->left);
  74.     SetBalance(root);
  75. }
  76.  
  77. void TurnRight(node *(&root))//правый поворот
  78. {
  79.     node *leftSubtree, *leftSubtreeRightSubtree;
  80.     leftSubtree = root->left;
  81.     leftSubtreeRightSubtree = leftSubtree->right;
  82.  
  83.     leftSubtree->right = root;
  84.     root->left = leftSubtreeRightSubtree;
  85.     root = leftSubtree;
  86.     SetBalance(root->right);
  87.     SetBalance(root);
  88. }
  89.  
  90.  
  91. void insert(node *(&root), int d) // добавление узла в дерево поиска
  92. {
  93.     if (root == nullptr)//нашли пустой указатель – пустое место
  94.     { //создаём новый узел дерева на найденном месте
  95.         root = new node;
  96.         root->info = d;
  97.         root->balance = 0;
  98.         root->left = nullptr;
  99.         root->right = nullptr;
  100.     }
  101.     else//текущий узел не пуст
  102.     {
  103.         if (d > root->info)//идём в правое поддерево
  104.  
  105.         {
  106.             insert(root->right, d);//добавляем узел в правое поддерево
  107.             if (Height(root->right) - Height(root->left) > 1)//если баланс АВЛ-дерева нарушен
  108.             {//выполняем вращения
  109.                 if (Height(root->right->right) < Height(root->right->left))//а если были еще проблемы в поддеревьях у правого поддерева
  110.                     TurnRight(root->right);//то предварительно поворачиваем правое поддерево
  111.                 TurnLeft(root);//поворот дерева влево
  112.             }
  113.         }
  114.         else if (d < root->info)//идём в левое поддерево
  115.  
  116.         {
  117.  
  118.             insert(root->left, d);//добавляем узел в левое поддерево
  119.             if (Height(root->left) - Height(root->right) > 1)//если баланс АВЛ-дерева нарушен
  120.             {
  121.                 if (Height(root->left->left) < Height(root->left->right))//а если были еще проблемы в поддеревьях у левого поддерева
  122.                     TurnLeft(root->left);//то предварительно поворачиваем левое поддерево
  123.                 TurnRight(root);//поворот дерева вправо
  124.             }
  125.         }
  126.  
  127.         SetBalance(root);//пересчитываем значение баланса
  128.     }
  129. }
  130.  
  131. void copytree(node *(&T1), node * (&root)){
  132. //    node *root = new node;
  133.  
  134.  
  135. }
  136. void print(node *p);
  137. void balance(node *(&root)) // балансировка
  138. {
  139.     if (root != nullptr)//нашли пустой указатель – пустое место//текущий узел не пуст
  140.     {
  141.         // сортим правое
  142.         balance(root->right);//добавляем узел в правое поддерево
  143.         if (Height(root->right) - Height(root->left) > 1)//если баланс АВЛ-дерева нарушен
  144.         {//выполняем вращения
  145.             if (Height(root->right->right) < Height(root->right->left))//а если были еще проблемы в поддеревьях у правого поддерева
  146.                 TurnRight(root->right);//то предварительно поворачиваем правое поддерево
  147.             TurnLeft(root);//поворот дерева влево
  148.         }
  149.  
  150.         //идём в левое поддерево
  151.  
  152.  
  153.         balance(root->left);//идём
  154.         if (Height(root->left) - Height(root->right) > 1)//если баланс АВЛ-дерева нарушен
  155.         {
  156.             if (Height(root->left->left) < Height(root->left->right))//а если были еще проблемы в поддеревьях у левого поддерева
  157.                 TurnLeft(root->left);//то предварительно поворачиваем левое поддерево
  158.             TurnRight(root);//поворот дерева вправо
  159.             cout << "PPPPP" << endl;
  160.  
  161.         }
  162.  
  163.  
  164.         SetBalance(root);//пересчитываем значение баланса
  165.     }
  166. }
  167. node* merge(node *(&T1), node *(T2)){
  168.     // выбрать левый в T2, удалить, добавить root(t1), добавить удалённое
  169.  
  170.     // удалить самую правую,
  171.     // идем по 2му, когда высота
  172.     node *v1 = T1, *pv1 = new node;
  173.     while(v1->right){
  174.         pv1 = v1;
  175.         v1 = v1->right;
  176.  
  177. //        v->left = nullptr;
  178.     }
  179.     pv1->right = nullptr;
  180.     // нашёл отчистил
  181.     node *v2 = T2, *pv2 = new node;
  182.     while(v2 != nullptr and Height(v2) != Height(T1)){
  183.         cout << "ERR " << v2->info << endl;
  184.         pv2 = v2;
  185.         v2 = v2->left;
  186.     }
  187.     node *S = new node;
  188.     S->info = v1->info;
  189.     S->left = T1;
  190.     S->right = v2;
  191.  
  192.     cout << "\n S: \n";
  193.     print(S);
  194.     cout << "\nv2\n" << v2->info;
  195.     pv2->left = S;
  196. //    balance(T2);
  197.     cout << "Start:\n";
  198.     print(T2);
  199.     balance(T2);
  200.     print(T2);
  201.     cout << "End\n";
  202. //    cout << "LEFT:" << v->info << " " << pv->info << "\n";
  203. //    pv->left = T1;
  204.     return T2;
  205.  
  206. //    insert(T2, v->info);
  207.  
  208.  
  209.  
  210.  
  211. }
  212.  
  213. void output(node *p)// распечатка дерева в симметричном порядке
  214. {
  215.     if (p != nullptr)
  216.     {
  217.         output(p->left);
  218.         cout << p->info << " ";
  219.         output(p->right);
  220.     }
  221. }
  222.  
  223. void print_n(const node *p, int n, int level, int prob)//печать n-ого уровня дерева, level - это номер уровня
  224. {
  225.     if (p)
  226.     {
  227.         if (level == n)
  228.         {
  229.             for (int i = 1; i <= prob; i++) cout << " ";
  230.             cout << p->info;
  231.         }
  232.         else
  233.         {
  234.             print_n(p->left, n, level + 1, prob);
  235.             print_n(p->right, n, level + 1, prob);
  236.         }
  237.     }
  238. }
  239.  
  240. void print(node *p) //распечатка дерева по уровням
  241. {
  242.     int h = Height(p);
  243.     int prob = 3;
  244.     if (p)
  245.     {
  246.         for (int i = 0; i <= h; i++)//вот здесь задаются номера уровней
  247.         {
  248.             print_n(p, i, 0, prob*(h - i));//вызывается функция печати n-ого уровня дерева
  249.             cout << endl;
  250.         }
  251.     }
  252.     cout << "H " << h << endl;
  253. }
  254.  
  255.  
  256. void clear(node **p) // очистка
  257. {
  258.     if ((*p) != nullptr) {
  259.         cout << "ERRr " << (*p)->info << endl;
  260.  
  261.         clear(&(*p)->left);
  262.         clear(&(*p)->right);
  263.  
  264.         delete *p;
  265.         *p = nullptr;
  266.     }
  267. }
  268.  
  269. void solve()
  270. {
  271.     int  d;
  272.     char ch;
  273.     node *root;
  274.     root = nullptr;
  275.     do {
  276.         cout << "enter num" << endl;
  277.         cin >> d;
  278.         insert(root, d);
  279.         cout << "eshe? (y/n)" << endl;
  280.         cin >> ch;
  281.  
  282.     } while (ch != 'n');
  283.  
  284.     node *root2;
  285.     root2 = nullptr;
  286.     do {
  287.         cout << "enter num" << endl;
  288.         cin >> d;
  289.         insert(root2, d);
  290.         cout << "eshe? (y/n)" << endl;
  291.         cin >> ch;
  292.  
  293.     } while (ch != 'n');
  294.  
  295.     cout << endl;
  296.     cout << "print1" << endl;
  297.     print(root);
  298.  
  299.     cout << "print2" << endl;
  300.     print(root2);
  301.     node *t = merge(root, root2);
  302.     cout << "print:\n";
  303.  
  304.     print(t);
  305.  
  306.     cout << "simm:\n";
  307.     output(t);
  308. //    cout << "\n EDGE: " << t->info << endl;
  309. //    clear(&root);
  310. //    clear(&root2);
  311.     clear(&t);
  312.     if (!root and !root2 and !t) { cout << "cleared!" << endl; }
  313.     else { cout << "err!" << endl; }
  314.     system("pause");
  315. }
  316.  
  317. int main() {
  318.     ios::sync_with_stdio(0);
  319.     cin.tie(0);
  320. #ifdef DEBUG
  321.     freopen("text.txt", "r", stdin);
  322. //    freopen("output.txt", "w", stdout);
  323. #endif
  324.     solve();
  325.     return 1;
  326. }
  327.  
  328.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement