Reputation: 35
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
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