(Remove Function) AVL Tree | Adelson-Velskii and Landis Tree In Data Structure Using C++

Data Structure Using C++

Tree Data Structure

AVL (Adelson-Velskii and Landis) Tree

(Remove Function) AVL Tree | Adelson-Velskii and Landis Tree

#include "AVLNode.cpp"
int max(int a, int b);
int height(AVLNode* N);
void fixHeight(AVLNode* N);
AVLNode *rightRotate(AVLNode *k2);
AVLNode *leftRotate(AVLNode *k1);
int getBalance(AVLNode *N);
AVLNode* insert(AVLNode* node, int info);
void inOrder(AVLNode *root);
AVLNode* findMin(AVLNode* node);
AVLNode* deleteNode(AVLNode* root, int key);
int main()
{
  AVLNode *root = NULL;
 
  /* Constructing tree given in the above figure */
    root = insert(root, 17);
    root = insert(root, 12);
    root = insert(root, 21);
    root = insert(root, 10);
    root = insert(root, 15);
    root = insert(root, 19);
    root = insert(root, 27);
    root = insert(root, 14);
    root = insert(root, 16);
    
    inOrder(root);
    cout<<endl; 
    root = deleteNode(root, 10);
 
    inOrder(root); 
    cout<<endl; 
    root = deleteNode(root, 15); 
 
    inOrder(root); 
    cout<<endl;
    root = deleteNode(root, 19);
 
    inOrder(root); 
    cout<<endl; 
    root = deleteNode(root, 12);
    inOrder(root);
 
    return 0;
}
AVLNode* findMin(AVLNode* node)
{
    if( node == NULL ) 
        return NULL;
    if( node->getLeft() == NULL ) 
        return node; // this is it.
    return findMin( node->getLeft() );
}
AVLNode* deleteNode(AVLNode* root, int info)
{
    if (root == NULL)
        return root;
    if ( info < root->getInfo() )
        root->setLeft(deleteNode(root->getLeft(), info)) ;
    else if( info > root->getInfo() )
        root->setRight(deleteNode(root->getRight(), info));
    else
    {
        // node with only one child or no child
        if( (root->getLeft() == NULL) || (root->getRight() == NULL) )
        {
            AVLNode *temp = root->getLeft() ? root->getLeft() : root->getRight();
 
            // No child case
            if (temp == NULL)
            {
                temp = root;
                root = NULL;
            }
            else // One child case
             *root = *temp; // Copy the contents of
                            // the non-empty child
        }
        else
        {
            // node with two children: Get the inorder
            // successor (smallest in the right subtree)
            AVLNode* temp = findMin(root->getRight());
 
            // Copy the inorder successor's data to this node
            root->setInfo(temp->getInfo()) ;
 
            // Delete the inorder successor
            root->setRight(deleteNode(root->getRight(), temp->getInfo())) ;
        }
    }
 
    // If the tree had only one node then return
    if (root == NULL)
      return root;
 
    // STEP 2: UPDATE HEIGHT OF THE CURRENT NODE
    fixHeight(root);
 
    // STEP 3: GET THE BALANCE FACTOR OF THIS NODE (to
    // check whether this node became unbalanced)
    int balance = getBalance(root);
 
    // If this node becomes unbalanced, then there are 4 cases
 
    // Left Left Case
    if (balance > 1 && getBalance(root->getLeft()) >= 0)
    {
        return rightRotate(root);
 }
    // Left Right Case
    if (balance > 1 && getBalance(root->getLeft()) < 0)
    {
        root->setLeft(leftRotate(root->getLeft()));
        return rightRotate(root);
    }
    // Right Right Case
    if (balance < -1 && getBalance(root->getRight()) <= 0)
    {
     return leftRotate(root);
 } 
    // Right Left Case
    if (balance < -1 && getBalance(root->getRight()) > 0)
    {
        root->setRight(rightRotate(root->getRight())) ;
        return leftRotate(root);
    }
 
    return root;
}
int height(AVLNode *N)
{
    if (N == NULL)
        return 0;
    return N->getHeight();
} 
void fixHeight(AVLNode* N){ 
    N->setHeight(max(height(N->getLeft()), height(N->getRight()))+1);
}
int max(int a, int b)
{
    return (a > b)? a : b;
}
AVLNode *rightRotate(AVLNode *k2)
{
    AVLNode *k1 = k2->getLeft();
    AVLNode *Y = k1->getRight();
 
    k1->setRight(k2);
    k2->setLeft(Y);
 
  fixHeight(k2);
  fixHeight(k1);
 
    return k1;
}
AVLNode *leftRotate(AVLNode *k1)
{
    AVLNode *k2 = k1->getRight();
    AVLNode *Y = k2->getLeft();
 
    k2->setLeft(k1);
    k1->setRight(Y);
 
  fixHeight(k1);
  fixHeight(k2);
 
    return k2;
}
int getBalance(AVLNode *N)
{
    if (N == NULL)
        return 0;
    return height(N->getLeft()) - height(N->getRight());
}
void inOrder(AVLNode *root)
{
    if(root != NULL)
    {
        inOrder(root->getLeft());
        cout<<root->getInfo()<<"\t";
        inOrder(root->getRight());
    }
}

Let me know in the comment section if you have any question.

Previous Post:
(Insert Function) AVL Tree | Adelson-Velskii and Landis Tree In Data Structure Using C++

Comments