Advertisement
davidcastrosalinas

ejemplo clase AVL

Dec 5th, 2020
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.23 KB | None | 0 0
  1. /* AVL Tree Implementation in C++   */
  2. /* Harish R                         */
  3. /* https://gist.github.com/Harish-R/097688ac7f48bcbadfa5 */
  4.  
  5. #include<iostream>
  6.  
  7. using namespace std;
  8.  
  9. class BST {
  10.     struct node {
  11.         int data;
  12.         node* left;
  13.         node* right;
  14.         int height;
  15.     };
  16.  
  17.     node* root;
  18.  
  19.     void makeEmpty(node* t) {
  20.         if(t == NULL)
  21.             return;
  22.         makeEmpty(t->left);
  23.         makeEmpty(t->right);
  24.         delete t;
  25.     }
  26.  
  27.     node* insert(int x, node* t) {
  28.         if(t == NULL)
  29.         {
  30.             t = new node;
  31.             t->data = x;
  32.             t->height = 0;
  33.             t->left = t->right = NULL;
  34.         }
  35.         else if(x < t->data)
  36.         {
  37.             t->left = insert(x, t->left);
  38.             if(height(t->left) - height(t->right) == 2)
  39.             {
  40.                 if(x < t->left->data)
  41.                     t = singleRightRotate(t);
  42.                 else
  43.                     t = doubleRightRotate(t);
  44.             }
  45.         }
  46.         else if(x > t->data)
  47.         {
  48.             t->right = insert(x, t->right);
  49.             if(height(t->right) - height(t->left) == 2)
  50.             {
  51.                 if(x > t->right->data)
  52.                     t = singleLeftRotate(t);
  53.                 else
  54.                     t = doubleLeftRotate(t);
  55.             }
  56.         }
  57.  
  58.         t->height = max(height(t->left), height(t->right))+1;
  59.         return t;
  60.     }
  61.  
  62.     node* singleRightRotate(node* &t) {
  63.         node* u = t->left;
  64.         t->left = u->right;
  65.         u->right = t;
  66.         t->height = max(height(t->left), height(t->right))+1;
  67.         u->height = max(height(u->left), t->height)+1;
  68.         return u;
  69.     }
  70.  
  71.     node* singleLeftRotate(node* &t) {
  72.         node* u = t->right;
  73.         t->right = u->left;
  74.         u->left = t;
  75.         t->height = max(height(t->left), height(t->right))+1;
  76.         u->height = max(height(t->right), t->height)+1 ;
  77.         return u;
  78.     }
  79.  
  80.     node* doubleLeftRotate(node* &t) {
  81.         t->right = singleRightRotate(t->right);
  82.         return singleLeftRotate(t);
  83.     }
  84.  
  85.     node* doubleRightRotate(node* &t) {
  86.         t->left = singleLeftRotate(t->left);
  87.         return singleRightRotate(t);
  88.     }
  89.  
  90.     node* findMin(node* t) {
  91.         if(t == NULL)
  92.             return NULL;
  93.         else if(t->left == NULL)
  94.             return t;
  95.         else
  96.             return findMin(t->left);
  97.     }
  98.  
  99.     node* findMax(node* t)
  100.     {
  101.         if(t == NULL)
  102.             return NULL;
  103.         else if(t->right == NULL)
  104.             return t;
  105.         else
  106.             return findMax(t->right);
  107.     }
  108.  
  109.     node* remove(int x, node* t)
  110.     {
  111.         node* temp;
  112.  
  113.         // Element not found
  114.         if(t == NULL)
  115.             return NULL;
  116.  
  117.         // Searching for element
  118.         else if(x < t->data)
  119.             t->left = remove(x, t->left);
  120.         else if(x > t->data)
  121.             t->right = remove(x, t->right);
  122.  
  123.         // Element found
  124.         // With 2 children
  125.         else if(t->left && t->right)
  126.         {
  127.             temp = findMin(t->right);
  128.             t->data = temp->data;
  129.             t->right = remove(t->data, t->right);
  130.         }
  131.         // With one or zero child
  132.         else
  133.         {
  134.             temp = t;
  135.             if(t->left == NULL)
  136.                 t = t->right;
  137.             else if(t->right == NULL)
  138.                 t = t->left;
  139.             delete temp;
  140.         }
  141.         if(t == NULL)
  142.             return t;
  143.  
  144.         t->height = max(height(t->left), height(t->right))+1;
  145.  
  146.         // If node is unbalanced
  147.         // If left node is deleted, right case
  148.         if(height(t->left) - height(t->right) == 2)
  149.         {
  150.             // right right case
  151.             if(height(t->left->left) - height(t->left->right) == 1)
  152.                 return singleLeftRotate(t);
  153.             // right left case
  154.             else
  155.                 return doubleLeftRotate(t);
  156.         }
  157.         // If right node is deleted, left case
  158.         else if(height(t->right) - height(t->left) == 2)
  159.         {
  160.             // left left case
  161.             if(height(t->right->right) - height(t->right->left) == 1)
  162.                 return singleRightRotate(t);
  163.             // left right case
  164.             else
  165.                 return doubleRightRotate(t);
  166.         }
  167.         return t;
  168.     }
  169.  
  170.     int height(node* t) {
  171.         return (t == NULL ? -1 : t->height);
  172.     }
  173.  
  174.     int getBalance(node* t) {
  175.         if(t == NULL)
  176.             return 0;
  177.         else
  178.             return height(t->left) - height(t->right);
  179.     }
  180.  
  181.     void inorder(node* t) {
  182.         if(t == NULL)
  183.             return;
  184.         inorder(t->left);
  185.         cout << t->data << " ";
  186.         inorder(t->right);
  187.     }
  188.  
  189.     typedef node* AB;
  190.     int altura(AB t){
  191.         if(t == NULL)
  192.             return -1; //el arbol tiene valor 0
  193.  
  194.         //recorro por la izq y por la derecha veo el al altura mayor
  195.         int alturaizq = altura(t->left);
  196.         int alturader = altura(t->right);
  197.         //cual de los dos es mayor
  198.         if(alturaizq > alturader)
  199.             return 1 + alturaizq;
  200.         else
  201.             return 1 + alturader;
  202.     }
  203.  
  204.  
  205. public:
  206.     BST() {
  207.         root = NULL;
  208.     }
  209.  
  210.     void insert(int x) {
  211.         root = insert(x, root);
  212.     }
  213.  
  214.     void remove(int x) {
  215.         root = remove(x, root);
  216.     }
  217.  
  218.     void display() {
  219.         inorder(root);
  220.         cout << endl;
  221.     }
  222.  
  223.     int altura(){
  224.        altura(root);
  225.     }
  226. };
  227.  
  228. int main()
  229. {
  230.     BST t;
  231.     t.insert(3);
  232.     t.insert(2);
  233.     t.insert(18);
  234.     t.insert(5);
  235.     t.insert(20);
  236.     t.insert(90);
  237.     t.insert(77);
  238.     t.insert(40);
  239.     t.insert(34);
  240.     t.insert(12);
  241.  
  242.     t.display();
  243.     cout <<endl<<"altura:"<<t.altura()<<endl;
  244.     return 0;
  245.  
  246.     t.insert(20);
  247.     t.insert(25);
  248.     t.insert(15);
  249.     t.insert(10);
  250.     t.insert(30);
  251.     t.insert(5);
  252.     t.insert(35);
  253.     t.insert(67);
  254.     t.insert(43);
  255.     t.insert(21);
  256.     t.insert(10);
  257.     t.insert(89);
  258.     t.insert(38);
  259.     t.insert(69);
  260.     cout << endl;
  261.     t.display();
  262.     t.remove(5);
  263.     t.remove(35);
  264.     t.remove(65);
  265.     t.remove(89);
  266.     t.remove(43);
  267.     t.remove(88);
  268.     t.remove(20);
  269.     t.remove(38);
  270.     t.display();
  271. }
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement