//there may be some mistakes but it works.
#include"stdio.h"
#include"conio.h"
#include"stdlib.h"
#include"alloc.h"
struct node
{
int data;
struct node *right;
struct node *left;
int bal;
};
typedef struct node node;
void avlinsert(node **,int,int *);
void rotateleft(node **);
void rotateright(node **);
void leftbal(node **,int *);
void rightbal(node **,int *);
void display(node *);
void delete_node(node **,int,int *);
void delbalright(node **,int *);
void delballeft(node **,int *);
void main()
{
node *root=NULL;
int taller=0;
int shorter=0;
clrscr();
avlinsert(&root,15,&taller);
avlinsert(&root,12,&taller);
avlinsert(&root,23,&taller);
avlinsert(&root,27,&taller);
printf("display in inorder:\n");
display(root);
delete_node(&root,23,&shorter);
printf("\nafter deletion :\n");
display(root);
getch();
}
void avlinsert(node **root,int x,int *taller)
{
node *newnode=(node *)malloc(sizeof(node));
if(*root==NULL)
{
*root=newnode;
(*root)->left=(*root)->right=NULL;
(*root)->data=x;
(*root)->bal=0;
*taller=1;
return;
}
if(x<(*root)->data)
{
avlinsert(&(*root)->left,x,taller);
if(*taller==1)
if((*root)->bal==-1)
leftbal(&(*root),taller);
else{
if((*root)->bal==0)
(*root)->bal=-1;
else
{(*root)->bal=0;
taller=0;
}
}}
else
{
avlinsert(&(*root)->right,x,taller);
if(*taller==1)
if((*root)->bal==0)
rightbal(&(*root),taller);
else{
if((*root)->bal==0)
(*root)->bal=1;
else
{(*root)->bal=1;
taller=0;
}
}return;
}}
void leftbal(node **root,int *taller)
{
node *l=NULL,*r=NULL;
l=(*root)->left;
if(l->bal==-1)
{ (*root)->bal=0;
l->bal=0;
rotateright(&(*root));
taller=0;
}
else
{r=l->right;
if((l->bal)==-1)
{(*root)->left=0;
l->bal=0;}
else{
if(r->bal==0)
l->bal=0;
else
{(*root)->bal=0;
l->bal=-1;}
}
r->bal=0;
rotateleft(&(*root)->left);
rotateright(&(*root));
*taller=0;}
}
void rightbal(node **root,int *taller)
{
node *r=NULL,*l=NULL;
r=(*root)->right;
if(r->bal==0)
{(*root)->bal=0;
r->bal=0;
rotateleft(&(*root));
*taller=0;
}
else
{
l=r->left;
if(l->bal==0)
{(*root)->bal=-1;
r->bal=0;}
else{
if(l->bal==0)
(*root)->bal=r->bal=0;
else
{(*root)->bal=0;
r->bal=1;}
}l->bal=0;
rotateright(&(*root)->right);
rotateleft(&(*root));
*taller=0;
}return;
}
void rotateleft(node **root)
{
node *temp=NULL;
temp=(*root)->right;
(*root)->right=temp->left;
temp->left=*root;
*root=temp;
}
void rotateright(node **root)
{
node *temp=NULL;
temp=(*root)->left;
(*root)->left=temp->right;
temp->right=*root;
*root=temp;
}
void display(node *p)
{
if(p!=NULL)
{
display(p->left);
printf("%d ",p->data);
display(p->right);
}
}
void delete_node(node **root,int x,int *shorter)
{
node *p=NULL,*n=NULL,*q=NULL;
if(*root==NULL)
{printf("list is empty/data not found");
return;
}
if(x==(*root)->data)
{
p=*root;
if((*root)->left==NULL)
(*root)=(*root)->right;
else if((*root)->right==NULL)
(*root)=(*root)->left;
if(p!=(*root))
{
free(p);
*shorter=1;
return;
}
q=*root;
n=(*root)->right;
while(n->left!=NULL)
{q=n;
n=n->left;}
if(q==(*root))
{(*root)->right=n->right;
*shorter=1;}
else
{
q->left=n->right;
if(*shorter==1)
delbalright(&(*root)->right,shorter);
}
n->left=(*root)->left;
n->right=(*root)->right;
free(*root);
*root=n;
if(*shorter==1)
delballeft(&(*root),shorter);
return;
}
if(x<(*root)->data)
{
delete_node(&(*root)->left,x,shorter);
if(*shorter==1)
delbalright(&(*root),shorter);
}
else{
delete_node(&(*root)->right,x,shorter);
if(*shorter==1)
delballeft(&(*root),shorter);
}}
void delbalright(node **root,int *shorter)
{
node *r=NULL,*l=NULL;
if((*root)->bal==-1)
(*root)->bal=0;
else
{
if((*root)->bal==0) {
(*root)->bal=1;
*shorter=0; }
else{
r=(*root)->right;
if(r->bal==0)
{
l=r->left;
if(l->bal==-1)
{r->bal=1;
(*root)->bal=1;}
else{
if(l->bal==0)
r->bal=(*root)->bal=0;
else{
(*root)->bal=1;
r->bal=0;}
}
l->bal=0;
rotateright(&(*root)->right);
rotateleft(&(*root));
}
else{
if(r->bal==1)
(*root)->bal=r->bal=0;
else{
if(r->bal==0)
{(*root)->bal=1;
r->bal=-1;
*shorter=0;}}
rotateleft(&(*root));
}} }}
void delballeft(node **root,int *shorter)
{
node *r=NULL,*l=NULL;
if((*root)->bal==1)
(*root)->bal=0;
else
{
if((*root)->bal==0) {
(*root)->bal=-1;
*shorter=0; }
else{
l=(*root)->left;
if(l->bal==-1)
{
r=l->right;
if(r->bal==1)
{l->bal=-1;
(*root)->bal=0;}
else{
if(l->bal==0)
l->bal=(*root)->bal=0;
else{
(*root)->bal=1;
l->bal=0;}
}
r->bal=0;
rotateleft(&(*root)->left);
rotateright(&(*root));
}
else{
if(l->bal==-1){
(*root)->bal=0;
l->bal=1;}
else{
//if(r->bal==0)
{(*root)->bal=-1;
l->bal=0;
*shorter=0;}}
rotateright(&(*root));
}} }}
No comments:
Post a Comment