loulett

AVL_Tree

May 3rd, 2015
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.29 KB | None | 0 0
  1. #include <algorithm>
  2. #include <vector>
  3. #include <iostream>
  4. #include <cassert>
  5. #include <fstream>
  6.  
  7. class AVL_Tree
  8. {
  9. public:
  10.     AVL_Tree() : root(0){}
  11.     ~AVL_Tree();
  12.  
  13.     bool Insert(int x);
  14.     bool Delete(int x);
  15.     int Find(int x)
  16.     {
  17.         Node* node = find(root, x);
  18.         return node->key;
  19.     }
  20.  
  21. private:
  22.     struct Node
  23.     {
  24.         int key;
  25.         int high;
  26.         int size;
  27.         Node* left;
  28.         Node* right;
  29.         Node* parent;
  30.  
  31.         Node(int key) : key(key), high(1), size(1), left(0), right(0), parent(0) {}
  32.     };
  33.  
  34.     Node* root;
  35.     void leftTurn(Node*& node);
  36.     void rightTurn(Node*& node);
  37.  
  38.     int hi(Node*& node) const;
  39.     int upd(Node*& node) const;
  40.     void updateSize(Node*& node);
  41.     void balanse(Node*& node);
  42.  
  43.     void deleteNode(Node*& node);
  44.  
  45.     Node* getNext(Node* node);
  46.     void detach(Node* node);
  47.     Node* find(Node* node, int key) const;
  48.     Node* f(Node* node, int key) const;
  49. };
  50.  
  51. int AVL_Tree::hi(Node*& node) const
  52. {
  53.     return((node == 0) ? 0 : node->high);
  54. }
  55.  
  56. int AVL_Tree::upd(Node*& node) const
  57. {
  58.     return((node == 0) ? 0 : node->size);
  59. }
  60.  
  61. void AVL_Tree::leftTurn(Node*& node)
  62. {
  63.     int fl = (node->parent == 0) ? 1 : 0;
  64.     Node* a = node;
  65.     Node* b = node->right;
  66.     a->right = b->left;
  67.     if (a->right != 0)
  68.         a->right->parent = a;
  69.     b->parent = a->parent;
  70.     if (!fl)
  71.     {
  72.         if (a->parent->key > a->key)
  73.             a->parent->left = b;
  74.         else if (a->parent->key < a->key)
  75.             a->parent->right = b;
  76.     }
  77.     b->left = a;
  78.     a->parent = b;
  79.     if (fl)
  80.         root = b;
  81.     updateSize(a);
  82. }
  83.  
  84. void AVL_Tree::rightTurn(Node*& node)
  85. {
  86.     int fl = (node->parent == 0) ? 1 : 0;
  87.     Node* a = node;
  88.     Node* b = node->left;
  89.     a->left = b->right;
  90.     if (a->left != 0)
  91.         a->left->parent = a;
  92.     b->parent = a->parent;
  93.     if (!fl)
  94.     {
  95.         if (a->parent->key > a->key)
  96.             a->parent->left = b;
  97.         else if (a->parent->key < a->key)
  98.             a->parent->right = b;
  99.     }
  100.     b->right = a;
  101.     a->parent = b;
  102.     if (fl)
  103.         root = b;
  104.     updateSize(a);
  105. }
  106.  
  107. void AVL_Tree::updateSize(Node*& node)
  108. {
  109.     node->high = std::max(hi(node->left), hi(node->right)) + 1;
  110.     node->size = upd(node->left)+ upd(node->right) + 1;
  111.     if (node->parent != 0)
  112.         updateSize(node->parent);
  113. }
  114.  
  115. void AVL_Tree::balanse(Node*& node)
  116. {
  117.     if (std::abs(hi(node->left) - hi(node->right)) <= 1)
  118.     {
  119.         if (node->right != 0)
  120.             balanse(node->right);
  121.         if (node->left != 0)
  122.             balanse(node->left);
  123.         return;
  124.     }
  125.     if (hi(node->left) - hi(node->right) < -1)
  126.     {
  127.         if (hi(node->right->left) <= hi(node->right->right))
  128.         {
  129.             leftTurn(node);
  130.         }
  131.         else
  132.         {
  133.             rightTurn(node->right);
  134.             leftTurn(node);
  135.         }
  136.     }
  137.     else
  138.     {
  139.         if (hi(node->left->right) <= hi(node->left->left))
  140.         {
  141.             rightTurn(node);
  142.         }
  143.         else
  144.         {
  145.             leftTurn(node->left);
  146.             rightTurn(node);
  147.         }
  148.     }
  149.     if (node->right != 0)
  150.         balanse(node->right);
  151.     if (node->left != 0)
  152.         balanse(node->left);
  153. }
  154.  
  155. AVL_Tree::~AVL_Tree()
  156. {
  157.     deleteNode(root);
  158.     root = 0;
  159. }
  160.  
  161. void AVL_Tree::deleteNode(Node*& node)
  162. {
  163.     if (node == 0)
  164.         return;
  165.     deleteNode(node->left);
  166.     deleteNode(node->right);
  167.  
  168.     delete node;
  169. }
  170.  
  171. bool AVL_Tree::Insert(int Key)
  172. {
  173.     if (!root)
  174.     {
  175.         root = new Node(Key);
  176.         return true;
  177.     }
  178.  
  179.     Node* cur_node = root;
  180.     while (true)
  181.     {
  182.         if (cur_node->key > Key && cur_node->left != 0)
  183.             cur_node = cur_node->left;
  184.         else if (cur_node->key < Key && cur_node->right != 0)
  185.             cur_node = cur_node->right;
  186.         else if (cur_node->key == Key)
  187.             return false;
  188.         else
  189.             break;
  190.     }
  191.     if (cur_node->key > Key)
  192.     {
  193.         cur_node->left = new Node(Key);
  194.         cur_node->left->parent = cur_node;
  195.     }
  196.     else if (cur_node->key < Key)
  197.     {
  198.         cur_node->right = new Node(Key);
  199.         cur_node->right->parent = cur_node;
  200.     }
  201.     updateSize(cur_node);
  202.     balanse(root);
  203.     return true;
  204. }
  205.  
  206. AVL_Tree::Node* AVL_Tree::find(Node* node, int x) const
  207. {
  208.     if (node == 0)
  209.         return 0;
  210.     int a = (node->left == 0) ? 0 : node->left->size;
  211.     if (a == x)
  212.         return node;
  213.     else if (a > x)
  214.         find(node->left, x);
  215.     else
  216.         find(node->right, x - a - 1);
  217. }
  218.  
  219. AVL_Tree::Node* AVL_Tree::f(Node* node, int Key) const
  220. {
  221.     if (node->key == Key)
  222.         return node;
  223.     return node->key > Key ? f(node->left, Key) : f(node->right, Key);
  224. }
  225.  
  226. bool AVL_Tree::Delete(int Key)
  227. {
  228.     Node* to_del = f(root, Key);
  229.  
  230.     if (to_del == 0)
  231.         return false;
  232.  
  233.     if (to_del->left == 0 || to_del->right == 0)
  234.     {
  235.         detach(to_del);
  236.         delete to_del;
  237.         balanse(root);
  238.         return true;
  239.     }
  240.  
  241.     Node* next = getNext(to_del);
  242.  
  243.     to_del->key = next->key;
  244.  
  245.     detach(next);
  246.  
  247.     delete next;
  248.     balanse(root);
  249.     return true;
  250. }
  251.  
  252. AVL_Tree::Node* AVL_Tree::getNext(Node* node)
  253. {
  254.     Node* candidate = node->right;
  255.     while (candidate->left != 0)
  256.         candidate = candidate->left;
  257.     return candidate;
  258. }
  259.  
  260. void AVL_Tree::detach(Node* node)
  261. {
  262.     assert(node->left == 0 || node->right == 0);
  263.  
  264.     if (node->parent == 0)
  265.         return;
  266.  
  267.     Node* child = node->left == 0 ? node->right : node->left;
  268.  
  269.     if (child != 0)
  270.     {
  271.         child->parent = node->parent;
  272.     }
  273.  
  274.     node->parent->left == node
  275.         ? node->parent->left = child
  276.         : node->parent->right = child;
  277.    
  278.     Node* parent = node->parent;
  279.     node->left = 0;
  280.     node->right = 0;
  281.     node->parent = 0;
  282.     updateSize(parent);
  283. }
  284.  
  285.  
  286. int main()
  287. {
  288.     AVL_Tree T;
  289.     int n = 0, num = 0, k = 0;
  290.     //std::ifstream finp;
  291.     //finp.open("input.txt");
  292.     std::cin >> n;
  293.     for (int i = 0; i < n; i++)
  294.     {
  295.         std::cin >> num >> k;
  296.         if (num > 0)
  297.             T.Insert(num);
  298.         else
  299.         {
  300.             num = -num;
  301.             T.Delete(num);
  302.         }
  303.         std::cout << T.Find(k) << '\n';
  304.     }
  305.     //finp.close();
  306.     return 0;
  307. }
Advertisement
Add Comment
Please, Sign In to add comment