Advertisement
radmickey

Untitled

Dec 13th, 2022
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstring>
  4. #include <cmath>
  5.  
  6. struct Node {
  7.     int value;
  8.     int height = 1;
  9.     Node* left = nullptr;
  10.     Node* right = nullptr;
  11. };
  12.  
  13. class AVL {
  14. private:
  15.  
  16.  
  17. public:
  18.     Node* head = nullptr;
  19.     int Height(Node* x){
  20.         if(x == nullptr){
  21.             return 0;
  22.         }
  23.         return x->height;
  24.     }
  25.  
  26.  
  27.     void fixHeight(Node* x){
  28.         if(x == nullptr){
  29.             return;
  30.         }
  31.         x->height = std::max(Height(x->left), Height(x->right)) + 1;
  32.     }
  33.  
  34.     int CheckBalance(Node* x){
  35.         if(x == nullptr){
  36.             return 0;
  37.         }
  38.         return Height(x->right) - Height(x->left);
  39.     }
  40.  
  41.  
  42.  
  43.     Node* RotateRight(Node* x){
  44.         Node* y = x->left;
  45.         x->left = y->right;
  46.         y->right = x;
  47.         fixHeight(x);
  48.         fixHeight(y);
  49.         return y;
  50.     }
  51.  
  52.     Node* RotateLeft(Node* x){
  53.         Node* y = x->right;
  54.         x->right = y->left;
  55.         y->left = x;
  56.         fixHeight(x);
  57.         fixHeight(y);
  58.         return y;
  59.     }
  60.  
  61.     Node* BalanceTree(Node* x){
  62.         fixHeight(x);
  63.         if(CheckBalance(x) == 2){
  64.             if(CheckBalance(x->right) < 0){
  65.                 x->right = RotateRight(x->right);
  66.             }
  67.             return RotateLeft(x);
  68.         }
  69.         if(CheckBalance(x) == -2){
  70.             if(CheckBalance(x->left) > 0){
  71.                 x->left = RotateLeft(x->left);
  72.             }
  73.             return RotateRight(x);
  74.         }
  75.         return x;
  76.     }
  77.     Node* Insert(Node* x, int value){
  78.         if(x == nullptr){
  79.             x = new Node;
  80.             x->value = value;
  81.             return x;
  82.         }
  83.         else if(x->value > value){
  84.             x->left = Insert(x->left, value);
  85.         }
  86.         else if( x-> value < value){
  87.             x->right = Insert(x->right, value);
  88.         }
  89.         return BalanceTree(x);
  90.     }
  91.  
  92.     bool Exists(int value){
  93.         if(head == nullptr){
  94.             return false;
  95.         }
  96.         Node* head_copy = head;
  97.         while(head_copy != nullptr){
  98.             if(value == head_copy->value){
  99.                 return true;
  100.             }
  101.             else if(head_copy->value > value){
  102.                 head_copy = head_copy->left;
  103.             }
  104.             else{
  105.                 head_copy = head_copy->right;
  106.             }
  107.         }
  108.         return false;
  109.     }
  110.  
  111.  
  112.     Node* remove(int value, Node* head) {
  113.         if (head->value > value) {
  114.             head->left = remove(value, head->left);
  115.         } else if (head->value < value) {
  116.             head->right = remove(value, head->right);
  117.         } else {
  118.             if (head->left == nullptr && head->right == nullptr) {
  119.                 delete head;
  120.                 return nullptr;
  121.             }
  122.  
  123.             if (head->left == nullptr && head->right != nullptr) {
  124.                 Node* temp = head->right;
  125.                 delete head;
  126.                 return temp;
  127.             }
  128.  
  129.             if (head->left != nullptr && head->right == nullptr) {
  130.                 Node* temp = head->left;
  131.                 delete head;
  132.                 return temp;
  133.             }
  134.  
  135.             // Если осталось два ребенка
  136.  
  137.             Node* max_deleted = head->left;
  138.  
  139.             head->height--;
  140.  
  141.             if (head->left->right == nullptr) {
  142.                 head->left->height--;
  143.             }
  144.  
  145.  
  146.             while (max_deleted->right != nullptr) {
  147.                 max_deleted->height--;
  148.                 max_deleted = max_deleted;
  149.             }
  150.  
  151.             std::swap(head->value, max_deleted->value);
  152.             head->left = remove(max_deleted->value, head->left);
  153.  
  154.         }
  155.  
  156.         return BalanceTree(head);
  157.  
  158.     }
  159. };
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166. int main() {
  167.  
  168.     int n;
  169.     std::cin >> n;
  170.     AVL avl_tree;
  171.  
  172.     while (n--) {
  173.         char c;
  174.         int i;
  175.  
  176.         std::cin >> c >> i;
  177.  
  178.         switch(c){
  179.             case 'A':
  180.                 if (avl_tree.Exists(i)) {
  181.                     break;
  182.                 }
  183.                 avl_tree.head = avl_tree.Insert(avl_tree.head, i);
  184.                 std::cout << avl_tree.CheckBalance(avl_tree.head) << '\n';
  185.                 break;
  186.             case 'D':
  187.                 if (!avl_tree.Exists(i)) {
  188.                     break;
  189.                 }
  190.  
  191.                 avl_tree.head = avl_tree.remove(i, avl_tree.head);
  192.                 std::cout << avl_tree.CheckBalance(avl_tree.head) << '\n';
  193.                 break;
  194.             case 'C':
  195.                 std::cout << (avl_tree.Exists(i) ? 'Y' : 'N') << '\n';
  196.                 break;
  197.         }
  198.     }
  199.  
  200.  
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement