alonso284

AVL.hpp

Feb 10th, 2024
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.66 KB | None | 0 0
  1. #include "Node.hpp"
  2. #include <queue>
  3. #include <algorithm>
  4.  
  5. enum Order { preorder = 1, inorder = 2, postorder = 3, level_by_level = 4 };
  6. Order to_order(unsigned int order){
  7.     return static_cast<Order>(order);
  8. }
  9.  
  10. template<class T>
  11. class AVL{
  12. private:
  13.     Node<T> *root;
  14.     unsigned int size;
  15.     void print(Node<T> *node, int level){
  16.         if(!node) return;
  17.  
  18.         print(node -> right, level+1);
  19.  
  20.         for(int i = 0; i < level; i++) std::cout << " - ";
  21.         std::cout << node -> data << ' ' << node -> height << std::endl;
  22.         /* std::cout << node -> data << ' ' << node -> left << ' ' << node -> right << std::endl; */
  23.  
  24.         print(node -> left, level+1);
  25.     }
  26.     void delete_node(Node<T> *node){
  27.         if(!node) return;
  28.         delete_node(node -> left);
  29.         delete_node(node -> right);
  30.         delete node;
  31.     }
  32.     void left_rotate(Node<T> **node){
  33.         Node<T> *A_ptr = *node;
  34.         Node<T> *B_ptr = (*node) -> right;
  35.  
  36.         *node = B_ptr;
  37.         A_ptr -> right = B_ptr -> left;
  38.         B_ptr -> left = A_ptr;
  39.  
  40.         A_ptr -> height = 1 + std::max(
  41.                 (A_ptr -> left? A_ptr -> left -> height: 0),
  42.                 (A_ptr -> right? A_ptr -> right -> height: 0)
  43.                 );
  44.         B_ptr -> height = 1 + std::max(
  45.                 (B_ptr -> left? B_ptr -> left -> height: 0),
  46.                 (B_ptr -> right? B_ptr -> right -> height: 0)
  47.                 );
  48.     }
  49.     void right_rotate(Node<T> **node){
  50.         Node<T> *A_ptr = *node;
  51.         Node<T> *B_ptr = (*node) -> left;
  52.  
  53.         *node = B_ptr;
  54.         A_ptr -> left = B_ptr -> right;
  55.         B_ptr -> right = A_ptr;
  56.  
  57.         A_ptr -> height = 1 + std::max(
  58.                 (A_ptr -> left? A_ptr -> left -> height: 0),
  59.                 (A_ptr -> right? A_ptr -> right -> height: 0)
  60.                 );
  61.         B_ptr -> height = 1 + std::max(
  62.                 (B_ptr -> left? B_ptr -> left -> height: 0),
  63.                 (B_ptr -> right? B_ptr -> right -> height: 0)
  64.                 );
  65.     }
  66.     void insert(Node<T> **node, const T& data){
  67.         if(!(*node)){
  68.             *node = new Node<T>(data);
  69.             return;
  70.         }
  71.  
  72.         if(data < (*node) -> data) insert(&((*node) -> left), data);
  73.         else insert(&((*node) -> right), data);
  74.  
  75.         (*node) -> height = 1 + std::max(
  76.                 ((*node) -> left? (*node) -> left -> height: 0),
  77.                 ((*node) -> right? (*node) -> right -> height: 0)
  78.                 );
  79.  
  80.         int bf =  ((*node) -> left? (*node) -> left -> height: 0)
  81.                 - ((*node) -> right? (*node) -> right -> height: 0);
  82.  
  83.         // si esta cargado a la izquierda y se agrego a la izquierda del hijo izquierdo
  84.         if(1 < bf){
  85.             if((*node) -> left -> data <= data)
  86.                 left_rotate(&(*node) -> left);
  87.             right_rotate(node);
  88.         }
  89.  
  90.         if(bf < -1){
  91.             if(data < (*node) -> right -> data)
  92.                 right_rotate(&(*node) -> right);
  93.             left_rotate(node);
  94.         }
  95.     }
  96.     void remove(Node<T> **node, const T &data){
  97.         if(!(*node))
  98.             return;
  99.         else if(data < (*node) -> data) remove(&((*node) -> left), data);
  100.         else if((*node) -> data < data) remove(&((*node) -> right), data);
  101.         else{
  102.             if((*node) -> left || (*node) -> right){
  103.                 Node<T> *to_delete;
  104.                 if((*node) -> right){
  105.                     Node<T> **temp = node;
  106.                     node = &((*node) -> right);
  107.  
  108.                     while((*node) -> left)
  109.                         node = &((*node) -> left);
  110.  
  111.                     std::swap((*node) -> data, (*temp) -> data);
  112.  
  113.                     to_delete = *node;
  114.                     *node = (*node) -> right;
  115.                 } else {
  116.                     to_delete = *node;
  117.                     *node = (*node) -> left;
  118.                 }
  119.                 delete to_delete;
  120.             } else{
  121.                 delete *node;
  122.                 *node = nullptr;
  123.             }
  124.             size--;
  125.             if(!(*node)) return;
  126.         }
  127.  
  128.         (*node) -> height = 1 + std::max(
  129.                 ((*node) -> left? (*node) -> left -> height: 0),
  130.                 ((*node) -> right? (*node) -> right -> height: 0)
  131.                 );
  132.  
  133.         int bf =  ((*node) -> left? (*node) -> left -> height: 0)
  134.                 - ((*node) -> right? (*node) -> right -> height: 0);
  135.  
  136.         // si esta cargado a la izquierda y se agrego a la izquierda del hijo izquierdo
  137.         if(1 < bf){
  138.             int bf_left =  ((*node) -> left -> left?  (*node) -> left -> left  -> height: 0)
  139.                          - ((*node) -> left -> right? (*node) -> left -> right -> height: 0);
  140.             if(bf_left < 0)
  141.                 left_rotate(&(*node) -> left);
  142.             right_rotate(node);
  143.         }
  144.  
  145.         if(bf < -1){
  146.             int bf_right =  ((*node) -> right -> left?  (*node) -> right -> left  -> height : 0)
  147.                           - ((*node) -> right -> right? (*node) -> right -> right -> height: 0);
  148.             if(0 < bf_right)
  149.                 right_rotate(&(*node) -> right);
  150.             left_rotate(node);
  151.         }
  152.     }
  153. public:
  154.     AVL(): root(nullptr), size(0){}
  155.     ~AVL(){ delete_node(root); }
  156.     void print(){
  157.         std::cout << std::endl;
  158.         std::cout << "Size: " << size << std::endl;
  159.         std::cout << std::endl;
  160.         print(root, 0);
  161.     }
  162.     void insert(const T& data){
  163.         insert(&root, data);       
  164.         size++;
  165.     }
  166.     void remove(const T& data){
  167.         remove(&root, data);
  168.     }
  169.     bool find(const T& data) const {
  170.         Node<T> *node = root;
  171.  
  172.         while(node && node -> data != data)
  173.             node = (data < node -> data ? node -> left: node -> right);
  174.  
  175.         return node;
  176.     }
  177. };
Advertisement
Add Comment
Please, Sign In to add comment