Thursday, 23 August 2012

AVL TREE Program


This code Is Doesn't EXIT For Duplicate Value Insertion and Deletion Of NonOccurent Value

#include<stdio.h>
#define max(a,b) ((a>b)?a:b)
typedef struct treenode
{
int data;
struct treenode *left,*right;

}avlnode;
avlnode *Root;
avlnode * delete(avlnode *,int);
preorder(avlnode *temp)
{
if(temp!=NULL)
{
printf("%d\t",temp->data);
preorder(temp->left);
preorder(temp->right);
    }
}
inorder(avlnode *temp)
{
if(temp!=NULL)
{
      inorder(temp->left);
      printf("%d\t",temp->data);
      inorder(temp->right);
    }
}
postorder(avlnode *temp)
{
    if(temp!=NULL)
    {
      postorder(temp->left);
      postorder(temp->right);
      printf("%d\t",temp->data);
    }
}
avlnode * LL(avlnode *A)
{
avlnode *B=A->left;
A->left=B->right;
B->right=A;
return B;
}
avlnode * RR(avlnode *A)
{
avlnode *B=A->right;
A->right=B->left;
B->left=A;
return B;
}
avlnode * LR(avlnode *A)
{
avlnode *B=A->left;
A->left=RR(B);
return LL(A);
}
avlnode * RL(avlnode *A)
{
avlnode *B=A->right;
A->right=LL(B);
return RR(A);
}
int height(avlnode *A)
{
if(A==NULL) return 0;
else return (max(height(A->left),height(A->right))+1);
}
int balance_factor(avlnode *A)
{
if(A==NULL) return 0;
else return(height(A->left)-height(A->right));
}
avlnode* balance(avlnode *A)
{
int leftfact,rightfact,fact=balance_factor(A);
if(fact>1)
{
leftfact=balance_factor(A->left);
if(leftfact>=0)
A=LL(A);
else
A=LR(A);
}
if(fact<-1)
{
rightfact=balance_factor(A->right);
if(rightfact<=0)
A=RR(A);
else
A=RL(A);
}
return(A);
}
avlnode * insert(avlnode *A,int value)
{
avlnode *temp;
if(A==NULL)
{
A=(avlnode *)malloc(sizeof(avlnode));
A->data=value;
A->left=NULL;
A->right=NULL;
printf("\nInsertion Successfull");
}
else if(value<A->data)
{
temp=insert(A->left,value);
if(temp!=NULL)
{
A->left=temp;
A=balance(A);
}
}
else if(value>A->data)
{
temp=insert(A->right,value);
if(temp!=NULL)
{
A->right=temp;
A=balance(A);
}
}
else
{
printf("\nERROR    Duplicate Value");
return NULL;
}
return(A);
}
avlnode *delete_case1(avlnode *del)
{
   free(del);
   return NULL;
}
avlnode *delete_case2(avlnode *del)
{
     avlnode *temp=del->left;
     free(del);
     return temp;
}
avlnode *delete_case3(avlnode *del)
{
   avlnode *temp=del->right;
   free(del);
   return temp;
}
void delete_case4(avlnode *del)
{
   int temp;
   avlnode *x;
   x=del->left;
   while(x->right!=NULL)
    x=x->right;
   temp=x->data;
   del->left=delete(del->left,x->data);
   del->data=temp;
}

avlnode *delete(avlnode *current,int value)
{
 
if(value<current->data)
{       if(current->left==NULL)
printf("Element %d Not Found",value);
else
{
current->left=delete(current->left,value);
current=balance(current);
}
}
else if(value>current->data)
{
if(current->right==NULL)
printf("Element %d Not Found",value);
else
{
current->right=delete(current->right,value);
current=balance(current);
}
}
   else if(current->data==value)
   {
     if((current->left==NULL) && (current->right==NULL))
current=delete_case1(current);
     else if((current->left!=NULL) && (current->left==NULL))
current=delete_case2(current);
     else if((current->left==NULL) && (current->right!=NULL))
current=delete_case3(current);
     else
delete_case4(current);
   }
   return current;
 }

main()
{
int choice,n;
avlnode *temp;
clrscr();
printf("\tAVL TREE\n");
printf("Remember\n\t1:Insert A Node\n\t2:Delete A Node\n\t3:Traversals Of");
printf(" The Tree\n\t4:Exit");
do
{
printf("\n\nEnter Your Choice:");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("\nEnter Element To Insert:");
scanf("%d",&n);
temp=insert(Root,n);
if(temp!=NULL)
Root=temp;
break;
case 2:
if(Root==NULL)
{
printf("\nNo Elements To Delete");
break;
}
printf("\nEnter Element To Delete:");
scanf("%d",&n);
temp=delete(Root,n);
if(temp!=NULL)
Root=temp;
break;
case 3:
if(Root==NULL)
{
printf("\nNo Elements To Display");
break;
}
printf("\n\tDisplay");
printf("\nPre Order :");
preorder(Root);
printf("\nIn Order  :");
inorder(Root);
printf("\nPost Order:");
postorder(Root);
break;
case 4:
exit();
default:
printf("Sorry Wrong Choice(\"_\")");
}
}while(1);
}

1 comments:

Post a Comment

 
Share