Advertisement
fooker

AVL

Oct 12th, 2023
671
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.17 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. class node{
  4. public:
  5.     int data;
  6.     int height;
  7.     node* left;
  8.     node* right;
  9.  
  10.     node(int data) : data(data), height(1), left(nullptr), right(nullptr) {};
  11.  
  12.     int max(int a, int b){
  13.         return ((a >= b) ? a : b);
  14.     }
  15.  
  16.     int factor() {
  17.         if (this == nullptr) return 0;
  18.         int left_height = (left != nullptr) ? left->height : 0;
  19.         int right_height = (right != nullptr) ? right->height : 0;
  20.         return left_height - right_height;
  21.     }
  22.  
  23.     node* right_rotation(){
  24.         node* x = left;
  25.         node* y = x->right;
  26.  
  27.         x->right = this;
  28.         this->left = y;
  29.  
  30.         this->height = 1 + max((right ? right->height : 0), (left ? left->height : 0));
  31.         x->height = 1 + max((x->right ? x->right->height : 0), (x->left ? x->left->height : 0));
  32.  
  33.         return x;
  34.     }
  35.  
  36.     node* left_rotation(){
  37.         node* x = right;
  38.         node* y = x->left;
  39.  
  40.         x->left = this;
  41.         this->right = y;
  42.  
  43.         this->height = 1 + max((right ? right->height : 0), (left ? left->height : 0));
  44.         x->height = 1 + max((x->right ? x->right->height : 0), (x->left ? x->left->height : 0));
  45.  
  46.         return x;
  47.     }
  48.  
  49.     node* insert(int key) {
  50.         node*& dest = (key >= data) ? right : left;
  51.         if (dest == nullptr) {
  52.             dest = new node(key);
  53.             this->height = 1 + max((right ? right->height : 0), (left ? left->height : 0));
  54.             return this;
  55.         } else if (key >= data) {
  56.             right = right->insert(key);
  57.         } else {
  58.             left = left->insert(key);
  59.         }
  60.  
  61.         this->height = 1 + max((right ? right->height : 0), (left ? left->height : 0));
  62.         int balance_factor = this->factor();
  63.  
  64.         if (balance_factor > 1 && (left && key < left->data)) {
  65.             return this->right_rotation();
  66.         } else if (balance_factor < -1 && (right && key > right->data)) {
  67.             return this->left_rotation();
  68.         } else if (balance_factor > 1 && (left && key > left->data)) {
  69.             left = left->left_rotation();
  70.             return this->right_rotation();
  71.         } else if (balance_factor < -1 && (right && key < right->data)) {
  72.             right = right->right_rotation();
  73.             return this->left_rotation();
  74.         } else return this;
  75.     }
  76.  
  77.     node* inorder_successor(){
  78.         node* curr = this;
  79.         while(curr->left){
  80.             curr = curr->left;
  81.         }
  82.         return curr;
  83.     }
  84.  
  85.     node* delete_node(int key){
  86.         if (this == nullptr) return this;
  87.         else if (key > data) right = right->delete_node(key);
  88.         else if (key < data) left = left->delete_node(key);
  89.         else {
  90.             if (left == nullptr or right == nullptr){
  91.                 node* temp = (left) ? left : right;
  92.                 delete this;
  93.                 return temp;
  94.                 // if (temp == nullptr){
  95.                 //  temp = this;
  96.                 //  this = nullptr;
  97.                 // } else {
  98.                 //  *this = *temp;
  99.                 // }
  100.             } else {
  101.                 node* temp = right->inorder_successor();
  102.                 data = temp->data;
  103.                 right = right->delete_node(key);
  104.             }
  105.         }
  106.  
  107.         if (this == nullptr) return this;
  108.  
  109.         this->height = 1 + max((right ? right->height : 0), (left ? left->height : 0));
  110.         int balance_factor = this->factor();
  111.  
  112.         if (balance_factor > 1 && (left && key < left->data)) {
  113.             return this->right_rotation();
  114.         } else if (balance_factor < -1 && (right && key > right->data)) {
  115.             return this->left_rotation();
  116.         } else if (balance_factor > 1 && (left && key > left->data)) {
  117.             left = left->left_rotation();
  118.             return this->right_rotation();
  119.         } else if (balance_factor < -1 && (right && key < right->data)) {
  120.             right = right->right_rotation();
  121.             return this->left_rotation();
  122.         } else return this;
  123.     }
  124.  
  125.     void inorder(){
  126.         if (this == nullptr) return ;
  127.         if (left != nullptr) left->inorder();
  128.         std::cout << data << " ";
  129.         if (right != nullptr) right->inorder();
  130.         return ;
  131.     }
  132.     void level_order(){
  133.         std::queue<node*> q;
  134.         q.push(this);
  135.         while(!q.empty()){
  136.             node* curr = q.front();
  137.             q.pop();
  138.             if (curr != nullptr) {
  139.                 std::cout << curr->data << " " ;
  140.                
  141.                 if (curr->left) q.push(curr->left);
  142.                 if (curr->right) q.push(curr->right);
  143.             }
  144.         }
  145.         return ;
  146.     }
  147.  
  148. };
  149.  
  150.  
  151. int main(){
  152.     node* root = new node(10);
  153.     root = root->insert(5);
  154.     root = root->insert(15);
  155.     root = root->insert(12);
  156.     root = root->insert(18);
  157.     root = root->insert(20);
  158.     root = root->insert(17);
  159.     root = root->insert(19);
  160.     root = root->insert(14);
  161.     root = root->insert(13);
  162.     root->inorder();
  163.     std::cout << std::endl;
  164.     root->level_order();
  165.  
  166.     return EXIT_SUCCESS;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement