faunuss

Untitled

Nov 20th, 2017
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <ctime>
  3. using namespace std;
  4.  
  5. #pragma region AVL
  6. struct Node { //Структура узла дерева, хранящий указатели на правое и левое поддерево + высоту
  7.     int key;
  8.     unsigned char height; //высота поддерева с корнем в данном узле
  9.     int NumRight; //Количество элементов в левом поддереве
  10.     Node* left; //Указатель на левое поддерево
  11.     Node* right; //Указатель на правое поддерево
  12.     Node(int k) : key(k), left(NULL), right(NULL), height(1), NumRight(0) {} //Конструктор
  13. };
  14.  
  15. class CAVLtree
  16. {
  17. public:
  18.     Node* root; //Корень дерева
  19.  
  20.     CAVLtree() //Конструктор
  21.     {
  22.         root = NULL;
  23.     }
  24.     ~CAVLtree() //Деструктор. НАПИСАТЬ!
  25.     {
  26.  
  27.     }
  28.  
  29.     int Insert(int key) //Вставка элемента
  30.     {
  31.         int num = 0;
  32.  
  33.        
  34.         root = insert(root, key,num,0);
  35.  
  36.  
  37.         //bool flag = false;
  38.         //InOrder(root, key, num, flag);
  39.         return num;
  40.     }
  41.     void remove(int pos)
  42.     {
  43.         root = remove(root, pos);
  44.     }
  45. private:
  46.     //Три вспомогательные функции, связанные с высотой
  47.     unsigned char Height(Node* node) //Возвращает высоту дерева или 0 - если дерево пустое
  48.     {
  49.         if (node != NULL)
  50.         {
  51.             return node->height;
  52.         }
  53.         return 0;
  54.     }
  55.     int BalanceFactor(Node* node) { //Вычисляет balance factor для заданного узла
  56.         return(Height(node->right) - Height(node->left)); // разница высоту правого поддерева и левого
  57.     }
  58.     void RebuildHeight(Node* node) { //Восстанавливает корректное значение высоты в данном узле
  59.         unsigned char LeftHeight = Height(node->left);
  60.         unsigned char RightHeight = Height(node->right);
  61.         if (LeftHeight > RightHeight) {
  62.             node->height = LeftHeight + 1;
  63.         }
  64.         else
  65.         {
  66.             node->height = RightHeight + 1;
  67.         }
  68.     }
  69.     //Повороты
  70.     void RotateLeft(Node*& node) //Левое вращение
  71.     {
  72.         Node* tmp = node->right;
  73.         node->right = tmp->left;
  74.         if (node->right == NULL)
  75.         {
  76.             node->NumRight = 0;
  77.         }
  78.         else
  79.         {
  80.             node->NumRight = node->right->NumRight + 1;
  81.         }
  82.         tmp->left = node;
  83.         RebuildHeight(node);
  84.         RebuildHeight(tmp);
  85.         node = tmp;
  86.     }
  87.     void RotateRight(Node*& node) //Правое вращение
  88.     {
  89.         Node* tmp = node->left;
  90.         node->left = tmp->right;
  91.         tmp->right = node;
  92.         if (tmp->right == NULL)
  93.         {
  94.             tmp->NumRight = 0;
  95.         }
  96.         else
  97.         {
  98.             tmp->NumRight = tmp->right->NumRight + 1;
  99.         }
  100.         RebuildHeight(node);
  101.         RebuildHeight(tmp);
  102.         node = tmp;
  103.     }
  104.     //Балансировка
  105.     void balance(Node*& node) { //балансировка узла
  106.         RebuildHeight(node);
  107.         if (BalanceFactor(node) == 2) { //если равен двум
  108.             if (BalanceFactor(node->right) < 0)
  109.             {
  110.                 RotateRight(node->right);
  111.             }
  112.             RotateLeft(node);
  113.         }
  114.         if (BalanceFactor(node) == -2) //если равен МИНУС двум
  115.         {
  116.             if (BalanceFactor(node->left) > 0)
  117.             {
  118.                 RotateLeft(node->left);
  119.             }
  120.             RotateRight(node);
  121.         }
  122.         return; // балансировка не нужна
  123.     }
  124.     //Вставка
  125.     Node* insert(Node* node, int key,int& pos,int min)
  126.     {
  127.  
  128.         if (node == NULL)
  129.         {
  130.             pos = min;
  131.             return new Node(key);
  132.         }
  133.         if (key < node->key) {
  134.             node->left = insert(node->left, key,pos,min+node->NumRight+1);
  135.         }
  136.         else
  137.         {
  138.             node->NumRight++;
  139.             node->right = insert(node->right, key,pos,min);
  140.         }
  141.         balance(node);
  142.  
  143.         return node;
  144.     }
  145.     void InOrder(Node* node, int key, int& num, bool& flag)
  146.     {
  147.         if (flag == true)
  148.         {
  149.             return;
  150.         }
  151.         if (node == NULL)
  152.         {
  153.             return;
  154.         }
  155.  
  156.         InOrder(node->right, key, num, flag);
  157.         if (key == node->key)
  158.         {
  159.             flag = true;
  160. //          cout << num;
  161.             return;
  162.         }
  163.         num++;
  164.         InOrder(node->left, key, num, flag);
  165.     }
  166.     //Удаление
  167.     Node* FindMin(Node* node)
  168.     {
  169.         if (node->left != NULL)
  170.         {
  171.             return FindMin(node->left);
  172.         }
  173.         return node;
  174.     }
  175.     Node* DeleteMin(Node* node)
  176.     {
  177.         if (node->left == NULL)
  178.         {
  179.             return node->right;
  180.         }
  181.         node->left = DeleteMin(node->left);
  182.         balance(node);
  183.         return node;
  184.     }
  185.     Node* remove(Node* node, int pos)
  186.     {
  187.         if (node == NULL)
  188.         {
  189.             return 0;
  190.         }
  191.         if (pos > node->NumRight)
  192.         {
  193.             node->left = remove(node->left, pos-1-node->NumRight);
  194.         }
  195.         else if(pos < node->NumRight)
  196.         {
  197.             node->right = remove(node->right, pos);
  198.         }
  199.         else
  200.         {
  201.             Node* left = node->left;
  202.             Node* right = node->right;
  203.             delete node;
  204.             if (right == NULL)
  205.             {
  206.                 return left;
  207.             }
  208.             Node* min = FindMin(right);
  209.             min->right = DeleteMin(right);
  210.             min->left = left;
  211.             balance(min);
  212.             return min;
  213.         }
  214.         balance(node);
  215.         return node;
  216.     }
  217.     void DelInOrder(Node* node, int& num, int& pos, bool& flag, Node*& tmp)
  218.     {
  219.         if (node == NULL)
  220.         {
  221.             return;
  222.         }
  223.         if (flag == true)
  224.         {
  225.             return;
  226.         }
  227.         DelInOrder(node->right, num, pos, flag, tmp);
  228.         if (num == pos)
  229.         {
  230.             flag = true;
  231.             tmp = node;
  232.         }
  233.         num++;
  234.         DelInOrder(node->left, num, pos, flag, tmp);
  235.     }
  236.  
  237.     int CountRecursive(Node* node)
  238.     {
  239.         int count = 1;
  240.         if (node->left != NULL)
  241.         {
  242.             count = count + CountRecursive(node->left);
  243.         }
  244.         if (node->right != NULL)
  245.         {
  246.             count = count + CountRecursive(node->right);
  247.         }
  248.         return count;
  249.     }
  250.  
  251. /*  int SearchByKey(Node* node,int key)
  252.     {
  253.         int pos = node->NumRight;
  254.         while (node->key != key) {
  255.             if (key > node -> key)
  256.             {
  257.                 node = node->left;
  258.                 if()
  259.             }
  260.         }
  261.     }*/
  262. };
  263.  
  264. #pragma endregion
  265.  
  266. int main()
  267. {
  268.  
  269.     int N = 0;
  270.     cin >> N;
  271.     CAVLtree AVL;
  272.  
  273.  
  274.     for (int i = 0; i < N; i++) {
  275.         int command = 0; int number = 0;
  276.         cin >> command;
  277.         cin >> number;
  278.         if (command == 1) {
  279.             cout << AVL.Insert(number);
  280.             cout << " ";
  281.         }
  282.         if (command == 2) {
  283.             AVL.remove(number);
  284.         }
  285.     }
  286.  
  287.     return 0;
  288. }
Add Comment
Please, Sign In to add comment