Advertisement
aniket123422

AVL

Dec 5th, 2022
746
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.26 KB | Source Code | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. struct Node{
  5.     int key;
  6.     Node *left, *right;
  7.     int height;
  8.  
  9.     Node(int x){
  10.         this->key=x;
  11.         this->left=NULL;
  12.         this->right=NULL;
  13.         this->height=1;
  14.     }
  15. };
  16.  
  17. class Avl_tree{
  18. private:
  19.     Node* root;
  20.  
  21.     void preorderHelper(Node* x){
  22.         if(x==NULL)
  23.             return;
  24.         cout<<x->key<<" ";
  25.         preorderHelper(x->left);
  26.         preorderHelper(x->right);
  27.  
  28.     }
  29.     Node* insertHelper(Node* x, int key){
  30.         if(x==NULL){
  31.             return new Node(key);
  32.         }
  33.         else if(key > x->key){
  34.             x->right= insertHelper(x->right, key);
  35.         }
  36.         else if(key < x->key){
  37.             x->left= insertHelper(x->left, key);
  38.         }
  39.         else{
  40.             return x;
  41.         }
  42.  
  43.         x->height= 1+ max(height(x->left), height(x->right));
  44.         int bf= getBalanceFactor(x);
  45.  
  46.         if(bf> 1 and key < x->left->key){
  47.             return rightRotate(x);
  48.         }
  49.         if(bf> 1 and key> x->left->key){
  50.             x->left= leftRotate(x->left);
  51.             return rightRotate(x);
  52.         }
  53.         if(bf<-1 and key> x->right->key){
  54.             return leftRotate(x);
  55.         }
  56.         if(bf< -1 and key < x->right->key){
  57.             x->right= rightRotate(x->right);
  58.             return leftRotate(x);
  59.         }
  60.  
  61.         return x;
  62.     }
  63.     Node* InorderSuccessor(Node* x){
  64.         while(x->left!=NULL){
  65.             x=x->left;
  66.         }
  67.         return x;
  68.     }
  69.     Node* deleteHelper(Node* x, int key){
  70.         if(x==NULL){
  71.             return x;
  72.         }
  73.         if(key < x->key){
  74.             x->left= deleteHelper(x->left, key);
  75.         }
  76.         else if(key> x->key){
  77.             x->right= deleteHelper(x->right, key);
  78.         }
  79.         else{
  80.             if(x->left==NULL or x->right==NULL){
  81.                 Node* temp= x->left? x->left: x->right;
  82.                 free(x);
  83.                 return temp;
  84.             }
  85.             else{
  86.                 Node* temp=InorderSuccessor(x->right);
  87.                 x->key= temp->key;
  88.                 x->right= deleteHelper(x->right, temp->key);
  89.             }
  90.         }
  91.         x->height= 1+ max(height(x->left), height(x->right));
  92.         int bf= getBalanceFactor(x);
  93.  
  94.         if(bf>1 and getBalanceFactor(x->left)>=0){
  95.             return rightRotate(x);
  96.         }
  97.         if(bf>1 and getBalanceFactor(x->left)<0 ){
  98.             x->left= leftRotate(x->left);
  99.             return rightRotate(x);
  100.         }
  101.         if(bf<-1 and getBalanceFactor(x->right)>=0){
  102.             x->right= rightRotate(x->right);
  103.             return leftRotate(x);
  104.         }
  105.         if(bf<-1 and getBalanceFactor(x->right)<0){
  106.             return leftRotate(x);
  107.         }
  108.         return x;
  109.     }
  110. public:
  111.     Avl_tree(){
  112.         root=NULL;
  113.     }
  114.     int height(Node* x){
  115.         if(x==NULL)
  116.             return 0;
  117.         return x->height;
  118.     }
  119.     int getBalanceFactor(Node* x){
  120.         if(x==NULL)
  121.             return 0;
  122.         return height(x->left)-height(x->right);
  123.     }
  124.     Node* leftRotate(Node* x){
  125.         Node *y= x->right;
  126.         Node *z= y->left;
  127.  
  128.         y->left= x;
  129.         x->right= z;
  130.  
  131.         x->height= 1+ max(height(x->left), height(x->right));
  132.         y->height= 1+ max(height(y->left), height(y->right));
  133.  
  134.         return y;    
  135.     }
  136.     Node* rightRotate(Node* x){
  137.         Node* y= x->left;
  138.         Node* z= y->right;
  139.  
  140.         y->right= x;
  141.         x->left=z;
  142.  
  143.         x->height= 1+ max(height(x->left), height(x->right));
  144.         y->height= 1+ max(height(y->left), height(y->right));
  145.        
  146.         return y;
  147.     }
  148.    
  149.     void insert(int key){  
  150.         root= insertHelper(root, key);
  151.     }
  152.    
  153.     void preorder(){
  154.         preorderHelper(root);
  155.     }
  156.     void deleteNode(int key){
  157.         root= deleteHelper(root, key);
  158.     }
  159.  
  160. };
  161. int main(){
  162.     Avl_tree avl;
  163.     avl.insert(12);
  164.     avl.insert(1);
  165.  
  166.     avl.insert(4);
  167.     avl.insert(3);
  168.     avl.insert(7);
  169.     avl.insert(8);
  170.     avl.insert(10);
  171.     avl.insert(2);
  172.     avl.insert(11);
  173.     avl.insert(5);
  174.     avl.insert(6);
  175.  
  176.     // avl.preorder();
  177.     avl.deleteNode(4);
  178.     avl.deleteNode(8);
  179.     avl.deleteNode(5);
  180.     avl.deleteNode(6);
  181.     avl.preorder();
  182.    
  183.     return 0;
  184. }
  185.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement