Abhi Jain
Abhi Jain

Reputation: 35

Right Rotate function of AVL is still giving old values?

I am writing right-rotate for AVL tree.Currently I am ignoring height part of AVL tree.I will take care of that later.But just applying right rotate at 5 is giving wrong values.l->data,ll->data,lll->data is still giving old values(5,3,2 respectively ) even after performing Right Rotate. AVL tree I have used is :

                                    9(Root)

               5(Left Child)                            13(Right Child)

         3                     7                  11                      17
    2
1

C Code:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>


struct AVLTree
{
  int data;
  struct AVLTree *left;
  struct AVLTree *right;
};




struct AVL *RightRotate1(struct AVLTree *rootop,struct AVLTree *root)
{
    if(root == NULL)
    {
        return NULL;
    }
    if(rootop->data > root->data)
    {
        root->right = RightRotate1(rootop,root->right);
    }
    else if(rootop->data < root->data )
    {
        root->left = RightRotate1(rootop,root->left);
    }
    else
    {
        struct AVLTree *A = rootop->left;
        rootop->left = A->right;
        A->right = rootop;

        return A;
    }
    return root;

}




int main()
{
    struct AVLTree * root = (struct AVLTree *)malloc(sizeof(struct AVLTree));
    root-> data = 9;
    struct AVLTree * l = (struct AVLTree *)malloc(sizeof(struct AVLTree));
    l -> data = 5;
    struct AVLTree * ll = (struct AVLTree *)malloc(sizeof(struct AVLTree));
    ll -> data = 3;
    ll -> left = ll -> right = NULL;
    struct AVLTree * lll = (struct AVLTree *)malloc(sizeof(struct AVLTree));
    lll -> data = 2;
    lll -> left = lll -> right = NULL;
    ll->left = lll;
    struct AVLTree * llll = (struct AVLTree *)malloc(sizeof(struct AVLTree));
    llll -> data = 1;
    llll -> left = llll -> right = NULL;
    lll->left = llll;
    struct AVLTree * lr = (struct AVLTree *)malloc(sizeof(struct AVLTree));
    lr -> data = 7;
    lr -> left = lr -> right = NULL;
    l -> left = ll;
    l -> right = lr;
    struct AVLTree * r = (struct AVLTree *)malloc(sizeof(struct AVLTree));
    r -> data = 13;
    struct AVLTree * rl = (struct AVLTree *)malloc(sizeof(struct AVLTree));
    rl -> data = 11;
    rl -> left = rl -> right = NULL;
    struct AVLTree * rr = (struct AVLTree *)malloc(sizeof(struct AVLTree));
    rr -> data = 17;
    rr -> left = rr -> right = NULL;
    r -> left = rl;
    r -> right = rr;
    root -> left = l;
    root -> right = r;



    root = RightRotate1(l,root);

    printf("Root is %d\n",root->data);
    printf("Root Left is %d\n",root->left->data);
    printf("Root Left Left is %d\n",root->left->left->data);
    printf("Root Left Right is %d\n",root->left->right->data);

    printf("Left is %d\n",l->data);
    printf("Left left is %d\n",ll->data);
    printf("Left right is %d\n",lll->data);


    return 0;
}

Upvotes: 0

Views: 47

Answers (1)

T Johnson
T Johnson

Reputation: 824

You are still getting the old values for l, ll, and lll because they are local variables defined in main() and they do not get new values after you return from RightRotate1(). Only the root pointer in main() gets changed by RightRotate1(). If you want to use l, ll, and lll they need to be reassigned to point to the new locations since you rotated the tree.

root = RightRotate1(l,root);
l = root->left;
ll = root->left->left;
lll = root->left->left->left;

Upvotes: 1

Related Questions