Advertisement
Guest User

AVL Tree Implementation

a guest
Feb 19th, 2013
2,158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.70 KB | None | 0 0
  1. // AVL Tree Implementation ----------------------------------------
  2.  
  3. struct N
  4. {
  5.     N *left, *right;
  6.     long balance, height, num, size;
  7.     bool leftHeavy()
  8.     {
  9.         return balance < 0 ? true : false;
  10.     }
  11.     bool rightHeavy()
  12.     {
  13.         return balance > 0 ? true : false;
  14.     }
  15.     bool unbalancedLeft()
  16.     {
  17.         return balance < -1 ? true : false;
  18.     }
  19.     bool unbalancedRight()
  20.     {
  21.         return balance > 1 ? true : false;
  22.     }
  23.     N(long newNum)
  24.     {
  25.         num = newNum;
  26.         balance = height = 0;
  27.         size = 1;
  28.         left = right = NULL;
  29.     }
  30. };
  31.  
  32. class T
  33. {
  34. private:
  35.     N *root;
  36.     long atPos(N *t, long p);
  37.     long count(N *t, long n);
  38.     N* erase(N *t, long num);
  39.     N* insert(N *t, long num);
  40.     long leftMost(N *t);
  41.     N *rotateL(N *t);
  42.     N* rotateR(N *t);
  43.     N *rotateLR(N *t);
  44.     N* rotateRL(N *t);
  45. public:
  46.     T();
  47.     long atPos(long p);
  48.     long count(long n);
  49.     void erase(long num);
  50.     void insert(long num);
  51. } Tree;
  52.  
  53. long T::atPos(N *t, long p)
  54. {
  55.     long l = t->left == NULL ? 0 : t->left->size;
  56.     long curr = l + 1;
  57.     long r = t->right == NULL ? 0 : t->right->size;
  58.  
  59.     if(p < curr)
  60.         return atPos(t->left, p);
  61.     if(p == curr)
  62.         return t->num;
  63.  
  64.     return atPos(t->right, p - curr);
  65. }
  66.  
  67. long T::atPos(long p)
  68. {
  69.     if(root == NULL || p > root->size)
  70.         return INVALID;
  71.  
  72.     return atPos(root, p);
  73. }
  74.  
  75. long T::count(N *t, long n)
  76. {
  77.     if(t == NULL)
  78.         return 0;
  79.  
  80.     if(n <= t->num)
  81.         return count(t->left, n);
  82.  
  83.     long ls = t->left == NULL ? 0 : t->left->size;
  84.     return ls + 1 + count(t->right, n);
  85. }
  86.  
  87. long T::count(long n)
  88. {
  89.     return count(root, n);
  90. }
  91.  
  92. N* T::rotateL(N *t)
  93. {
  94.     N *b = t->right;
  95.     t->right = b->left;
  96.     b->left = t;
  97.  
  98.     long oldBalT = t->balance;
  99.     long oldBalB = b->balance;
  100.  
  101.     t->balance = oldBalT - 1 - max(oldBalB, (long) 0);
  102.     b->balance = oldBalB - 1 + min(t->balance, (long) 0);
  103.  
  104.     long lh = t->left == NULL ? 0 : t->left->height;
  105.     long ls = t->left == NULL ? 0 : t->left->size;
  106.     long rh = t->right == NULL ? 0 : t->right->height;
  107.     long rs = t->right == NULL ? 0 : t->right->size;
  108.     t->height = max(lh, rh) + 1;
  109.     t->size = ls + rs + 1;
  110.  
  111.     lh = b->left == NULL ? 0 : b->left->height;
  112.     ls = b->left == NULL ? 0 : b->left->size;
  113.     rh = b->right == NULL ? 0 : b->right->height;
  114.     rs = b->right == NULL ? 0 : b->right->size;
  115.     b->height = max(lh, rh) + 1;
  116.     b->size = ls + rs + 1;
  117.  
  118.     return b;
  119. }
  120.  
  121. N* T::rotateR(N *t)
  122. {
  123.     N *b = t->left;
  124.     t->left = b->right;
  125.     b->right = t;
  126.  
  127.     long oldBalT = t->balance;
  128.     long oldBalB = b->balance;
  129.  
  130.     t->balance = oldBalT + 1 - min(oldBalB, (long) 0);
  131.     b->balance = oldBalB + 1 + max(t->balance, (long) 0);
  132.  
  133.     long lh = t->left == NULL ? 0 : t->left->height;
  134.     long ls = t->left == NULL ? 0 : t->left->size;
  135.     long rh = t->right == NULL ? 0 : t->right->height;
  136.     long rs = t->right == NULL ? 0 : t->right->size;
  137.     t->height = max(lh, rh) + 1;
  138.     t->size = ls + rs + 1;
  139.  
  140.     lh = b->left == NULL ? 0 : b->left->height;
  141.     ls = b->left == NULL ? 0 : b->left->size;
  142.     rh = b->right == NULL ? 0 : b->right->height;
  143.     rs = b->right == NULL ? 0 : b->right->size;
  144.     b->height = max(lh, rh) + 1;
  145.     b->size = ls + rs + 1;
  146.  
  147.     return b;
  148. }
  149.  
  150. N* T::rotateRL(N *t)
  151. {
  152.     t->left = rotateL(t->left);
  153.     long rh = t->right == NULL ? 0 : t->right->height;
  154.     long rs = t->right == NULL ? 0 : t->right->size;
  155.     t->height = max(t->left->height, rh) + 1;
  156.     t->size = t->left->size + rs + 1;
  157.     t->balance = rh - t->left->height;
  158.     return rotateR(t);
  159.     return t;
  160. }
  161.  
  162. N* T::rotateLR(N *t)
  163. {
  164.     t->right = rotateR(t->right);
  165.     long lh = t->left == NULL ? 0 : t->left->height;
  166.     long ls = t->left == NULL ? 0 : t->left->size;
  167.     t->height = max(lh, t->right->height) + 1;
  168.     t->balance = t->right->height - lh;
  169.     t->size = ls + t->right->size + 1;
  170.     return rotateL(t);
  171.     return t;
  172. }
  173.  
  174. N* T::insert(N *t, long num)
  175. {
  176.     if(num < t->num)
  177.     {
  178.         if(t->left == NULL)
  179.             t->left = new N(num);
  180.  
  181.         t->left = insert(t->left, num);
  182.     }
  183.     if(num > t->num)
  184.     {
  185.         if(t->right == NULL)
  186.             t->right = new N(num);
  187.  
  188.         t->right = insert(t->right, num);
  189.     }
  190.  
  191.     long lh = t->left == NULL ? 0 : t->left->height;
  192.     long ls = t->left == NULL ? 0 : t->left->size;
  193.     long rh = t->right == NULL ? 0 : t->right->height;
  194.     long rs = t->right == NULL ? 0 : t->right->size;
  195.     t->height = max(lh, rh) + 1;
  196.     t->size = ls + rs + 1;
  197.     t->balance = rh - lh;
  198.  
  199.     if(t->unbalancedLeft())
  200.     {
  201.         if(t->left->rightHeavy())
  202.             return rotateRL(t);
  203.         else
  204.             return rotateR(t);
  205.     }
  206.     if(t->unbalancedRight())
  207.     {
  208.         if(t->right->leftHeavy())
  209.             return rotateLR(t);
  210.         else
  211.         return rotateL(t);
  212.     }
  213.  
  214.     return t;
  215. }
  216.  
  217. long T::leftMost(N *t)
  218. {
  219.     if(t->left == NULL)
  220.         return t->num;
  221.  
  222.     return leftMost(t->left);
  223. }
  224.  
  225. N* T::erase(N *t, long num)
  226. {
  227.     if(num < t->num)
  228.     {
  229.         if(t->left == NULL)
  230.             return t;
  231.  
  232.         t->left = erase(t->left, num);
  233.     }
  234.     if(num > t->num)
  235.     {
  236.         if(t->right == NULL)
  237.             return t;
  238.  
  239.         t->right = erase(t->right, num);
  240.     }
  241.     if(num == t->num)
  242.     {
  243.         int children = 0;
  244.         children += t->left != NULL ? 1 : 0;
  245.         children += t->right != NULL ? 1 : 0;
  246.  
  247.         if(children == 0)
  248.             return NULL;
  249.         if(children == 1)
  250.             return t->right != NULL ? t->right : t->left;
  251.         if(children == 2)
  252.         {
  253.             long suc = leftMost(t->right);
  254.             t->right = erase(t->right, suc);
  255.             t->num = suc;
  256.         }
  257.     }
  258.  
  259.     long lh = t->left == NULL ? 0 : t->left->height;
  260.     long ls = t->left == NULL ? 0 : t->left->size;
  261.     long rh = t->right == NULL ? 0 : t->right->height;
  262.     long rs = t->right == NULL ? 0 : t->right->size;
  263.     t->height = max(lh, rh) + 1;
  264.     t->size = ls + rs + 1;
  265.     t->balance = rh - lh;
  266.  
  267.     if(t->unbalancedLeft())
  268.     {
  269.         if(t->left->rightHeavy())
  270.             return rotateRL(t);
  271.         else
  272.             return rotateR(t);
  273.     }
  274.     if(t->unbalancedRight())
  275.     {
  276.         if(t->right->leftHeavy())
  277.             return rotateLR(t);
  278.         else
  279.             return rotateL(t);
  280.     }
  281.  
  282.     return t;
  283. }
  284.  
  285. void T::erase(long num)
  286. {
  287.     if(root == NULL)
  288.         return;
  289.  
  290.     root = erase(root, num);
  291. }
  292.  
  293. void T::insert(long num)
  294. {
  295.     if(root == NULL)
  296.     {
  297.         root = new N(num);
  298.         return;
  299.     }
  300.  
  301.     root = insert(root, num);
  302. }
  303.  
  304. T::T()
  305. {
  306.     root = NULL;
  307. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement