Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

In C++ Write a function to apply left or right rotations to a binary search tree

ID: 3678392 • Letter: I

Question

In C++

Write a function to apply left or right rotations to a binary search tree based on the height of the left and right sub-trees of the root. The function should first determine if a binary search tree is height balanced, and if not, rotate the tree until it is. Your algorithm may need to apply a left or right rotation multiple times. You will not need to apply both a left and right rotation to any tree. The function should return the root of the tree.

TreeNode* CheckHeightAndRotate(TreeNode *root);

TreeNode struct:

Example:

Input Tree: 15 18 5 12 Expected Output: 15 3 6 12 18

Explanation / Answer

#include<stdio.h>

#include<stdlib.h>

// An AVL tree node

struct node

{

    int key;

    struct node *left;

    struct node *right;

    int height;

};

// A utility function to get maximum of two integers

int max(int a, int b);

// A utility function to get height of the tree

int height(struct node *N)

{

    if (N == NULL)

        return 0;

    return N->height;

}

// A utility function to get maximum of two integers

int max(int a, int b)

{

    return (a > b)? a : b;

}

/* Helper function that allocates a new node with the given key and

    NULL left and right pointers. */

struct node* newNode(int key)

{

    struct node* node = (struct node*)

                        malloc(sizeof(struct node));

    node->key   = key;

    node->left   = NULL;

    node->right = NULL;

    node->height = 1; // new node is initially added at leaf

    return(node);

}

// A utility function to right rotate subtree rooted with y

// See the diagram given above.

struct node *rightRotate(struct node *y)

{

    struct node *x = y->left;

    struct node *T2 = x->right;

    // Perform rotation

    x->right = y;

    y->left = T2;

    // Update heights

    y->height = max(height(y->left), height(y->right))+1;

    x->height = max(height(x->left), height(x->right))+1;

    // Return new root

    return x;

}

// A utility function to left rotate subtree rooted with x

// See the diagram given above.

struct node *leftRotate(struct node *x)

{

    struct node *y = x->right;

    struct node *T2 = y->left;

    // Perform rotation

    y->left = x;

    x->right = T2;

    // Update heights

    x->height = max(height(x->left), height(x->right))+1;

    y->height = max(height(y->left), height(y->right))+1;

    // Return new root

    return y;

}

// Get Balance factor of node N

int getBalance(struct node *N)

{

    if (N == NULL)

        return 0;

    return height(N->left) - height(N->right);

}

struct node* insert(struct node* node, int key)

{

    /* 1. Perform the normal BST rotation */

    if (node == NULL)

        return(newNode(key));

    if (key < node->key)

        node->left = insert(node->left, key);

    else

        node->right = insert(node->right, key);

    /* 2. Update height of this ancestor node */

    node->height = max(height(node->left), height(node->right)) + 1;

    /* 3. Get the balance factor of this ancestor node to check whether

       this node became unbalanced */

    int balance = getBalance(node);

    // If this node becomes unbalanced, then there are 4 cases

    // Left Left Case

    if (balance > 1 && key < node->left->key)

        return rightRotate(node);

    // Right Right Case

    if (balance < -1 && key > node->right->key)

        return leftRotate(node);

    // Left Right Case

    if (balance > 1 && key > node->left->key)

    {

        node->left = leftRotate(node->left);

        return rightRotate(node);

    }

    // Right Left Case

    if (balance < -1 && key < node->right->key)

    {

        node->right = rightRotate(node->right);

        return leftRotate(node);

    }

    /* return the (unchanged) node pointer */

    return node;

}

// A utility function to print preorder traversal of the tree.

// The function also prints height of every node

void preOrder(struct node *root)

{

    if(root != NULL)

    {

        printf("%d ", root->key);

        preOrder(root->left);

        preOrder(root->right);

    }

}

/* Drier program to test above function*/

int main()

{

  struct node *root = NULL;

  /* Constructing tree given in the above figure */

  root = insert(root, 10);

  root = insert(root, 20);

  root = insert(root, 30);

  root = insert(root, 40);

  root = insert(root, 50);

  root = insert(root, 25);

  /* The constructed AVL Tree would be

            30

           /

         20   40

        /     

       10 25    50

  */

  printf("Pre order traversal of the constructed AVL tree is ");

  preOrder(root);

  return 0;

}

#include<stdio.h>

#include<stdlib.h>

// An AVL tree node

struct node

{

    int key;

    struct node *left;

    struct node *right;

    int height;

};

// A utility function to get maximum of two integers

int max(int a, int b);

// A utility function to get height of the tree

int height(struct node *N)

{

    if (N == NULL)

        return 0;

    return N->height;

}

// A utility function to get maximum of two integers

int max(int a, int b)

{

    return (a > b)? a : b;

}

/* Helper function that allocates a new node with the given key and

    NULL left and right pointers. */

struct node* newNode(int key)

{

    struct node* node = (struct node*)

                        malloc(sizeof(struct node));

    node->key   = key;

    node->left   = NULL;

    node->right = NULL;

    node->height = 1; // new node is initially added at leaf

    return(node);

}

// A utility function to right rotate subtree rooted with y

// See the diagram given above.

struct node *rightRotate(struct node *y)

{

    struct node *x = y->left;

    struct node *T2 = x->right;

    // Perform rotation

    x->right = y;

    y->left = T2;

    // Update heights

    y->height = max(height(y->left), height(y->right))+1;

    x->height = max(height(x->left), height(x->right))+1;

    // Return new root

    return x;

}

// A utility function to left rotate subtree rooted with x

// See the diagram given above.

struct node *leftRotate(struct node *x)

{

    struct node *y = x->right;

    struct node *T2 = y->left;

    // Perform rotation

    y->left = x;

    x->right = T2;

    // Update heights

    x->height = max(height(x->left), height(x->right))+1;

    y->height = max(height(y->left), height(y->right))+1;

    // Return new root

    return y;

}

// Get Balance factor of node N

int getBalance(struct node *N)

{

    if (N == NULL)

        return 0;

    return height(N->left) - height(N->right);

}

struct node* insert(struct node* node, int key)

{

    /* 1. Perform the normal BST rotation */

    if (node == NULL)

        return(newNode(key));

    if (key < node->key)

        node->left = insert(node->left, key);

    else

        node->right = insert(node->right, key);

    /* 2. Update height of this ancestor node */

    node->height = max(height(node->left), height(node->right)) + 1;

    /* 3. Get the balance factor of this ancestor node to check whether

       this node became unbalanced */

    int balance = getBalance(node);

    // If this node becomes unbalanced, then there are 4 cases

    // Left Left Case

    if (balance > 1 && key < node->left->key)

        return rightRotate(node);

    // Right Right Case

    if (balance < -1 && key > node->right->key)

        return leftRotate(node);

    // Left Right Case

    if (balance > 1 && key > node->left->key)

    {

        node->left = leftRotate(node->left);

        return rightRotate(node);

    }

    // Right Left Case

    if (balance < -1 && key < node->right->key)

    {

        node->right = rightRotate(node->right);

        return leftRotate(node);

    }

    /* return the (unchanged) node pointer */

    return node;

}

// A utility function to print preorder traversal of the tree.

// The function also prints height of every node

void preOrder(struct node *root)

{

    if(root != NULL)

    {

        printf("%d ", root->key);

        preOrder(root->left);

        preOrder(root->right);

    }

}

/* Drier program to test above function*/

int main()

{

  struct node *root = NULL;

  /* Constructing tree given in the above figure */

  root = insert(root, 10);

  root = insert(root, 20);

  root = insert(root, 30);

  root = insert(root, 40);

  root = insert(root, 50);

  root = insert(root, 25);

  /* The constructed AVL Tree would be

            30

           /

         20   40

        /     

       10 25    50

  */

  printf("Pre order traversal of the constructed AVL tree is ");

  preOrder(root);

  return 0;

}