[code]
bstree.c
#include<stdlib.h>
#include<stdio.h>
#include "bstree.h"
void R_Rotate(BSTNode **a)
{
BSTNode *b;
b=(*a)->left;
(*a)->left=b->right;
b->right=*a;
*a=b;
}
void L_Rotate(BSTNode **a)
{
BSTNode *b;
b=(*a)->right;
(*a)->right=b->left;
b->left=*a;
*a=b;
}
void LeftBalance(BSTNode **a)
{
//add your code
BSTNode *lc=(BSTNode *)malloc(sizeof(BSTNode));
BSTNode *rd=(BSTNode *)malloc(sizeof(BSTNode));
lc=(*a)->left;
switch(lc->bf)
{
case 1:
(*a)->bf=lc->bf=0;
R_Rotate(a);
break;
case -1:
rd=lc->right;
switch(rd->bf)
{
case 1 :
(*a)->bf=-1;
lc->bf=0;
break;
case 0 :
(*a)->bf=lc->bf=0;
break;
case -1 :
(*a)->bf=0;
lc->bf=1;
break;
}
rd->bf=0;
L_Rotate(&((*a)->left));
R_Rotate(a);
break;
}
}
void RightBalance(BSTNode **a)
{
BSTNode *rc=(BSTNode *)malloc(sizeof(BSTNode));
BSTNode *ld=(BSTNode *)malloc(sizeof(BSTNode));
rc=(*a)->right;
switch(rc->bf)
{
case -1:
(*a)->bf=rc->bf=0;
L_Rotate(a);break;
case 1 :
ld=rc->left;
switch(ld->bf)
{
case 1:
(*a)->bf=0;
rc->bf=-1;
break;
case 0 :
(*a)->bf=rc->bf=0;
break;
case -1 :
(*a)->bf=1;
rc->bf=0;
break;
}
ld->bf=0;
R_Rotate(&((*a)->right));
L_Rotate(a);
}
}
int InsertAVL(BSTNode **base , DataType e,int taller)
{
//add your code
if(*base==NULL)
{
*base=(BSTNode *)malloc(sizeof(BSTNode));
(*base)->left=(*base)->right=NULL;
(*base)->data=e;
(*base)->bf=0;
taller=1;
}
else
{
if(e==(*base)->data)
{
taller=0;
return 0;
}
else if(e<(*base)->data)
{
if(!InsertAVL(&((*base)->left),e,taller))
return 0;
if(taller)
{
switch((*base)->bf)
{
case 1:
LeftBalance(base);
taller=0;
break;
case 0 :
(*base)->bf=1;
taller=1;
break;
case -1:
(*base)->bf=0;
taller=0;
break;
}
}
}
else
{
if(!InsertAVL(&((*base)->right),e,taller))
return 0;
if(taller)
{
switch((*base)->bf)
{
case 1:
(*base)->bf=0;
taller=0;
break;
case 0:
(*base)->bf=-1;
taller=1;
break;
case -1:
RightBalance(base);
taller=0;
break;
}
}
}
}
return 1;
}
int Delete(BSTNode **a , DataType key)
{
//add your code
if(*a==NULL)
return 0;
/*when find the key ,begin to delete it.*/
if((*a)->data==key)
{
//to add your code
}
}
bstree.h
typedef int DataType;
struct bstnode
{
DataType data;
int bf ;
int visited;
struct bstnode *left,*right;
};
typedef struct bstnode BSTNode;
void R_Rotate(BSTNode **a);
void L_Rotate(BSTNode **a);
void LeftBalance(BSTNode **a);
void RightBalance(BSTNode **a);
int InsertAVL(BSTNode **base,DataType key,int taller);
int Delete(BSTNode **a , DataType key);
[/code]
bstree.c
#include<stdlib.h>
#include<stdio.h>
#include "bstree.h"
void R_Rotate(BSTNode **a)
{
BSTNode *b;
b=(*a)->left;
(*a)->left=b->right;
b->right=*a;
*a=b;
}
void L_Rotate(BSTNode **a)
{
BSTNode *b;
b=(*a)->right;
(*a)->right=b->left;
b->left=*a;
*a=b;
}
void LeftBalance(BSTNode **a)
{
//add your code
BSTNode *lc=(BSTNode *)malloc(sizeof(BSTNode));
BSTNode *rd=(BSTNode *)malloc(sizeof(BSTNode));
lc=(*a)->left;
switch(lc->bf)
{
case 1:
(*a)->bf=lc->bf=0;
R_Rotate(a);
break;
case -1:
rd=lc->right;
switch(rd->bf)
{
case 1 :
(*a)->bf=-1;
lc->bf=0;
break;
case 0 :
(*a)->bf=lc->bf=0;
break;
case -1 :
(*a)->bf=0;
lc->bf=1;
break;
}
rd->bf=0;
L_Rotate(&((*a)->left));
R_Rotate(a);
break;
}
}
void RightBalance(BSTNode **a)
{
BSTNode *rc=(BSTNode *)malloc(sizeof(BSTNode));
BSTNode *ld=(BSTNode *)malloc(sizeof(BSTNode));
rc=(*a)->right;
switch(rc->bf)
{
case -1:
(*a)->bf=rc->bf=0;
L_Rotate(a);break;
case 1 :
ld=rc->left;
switch(ld->bf)
{
case 1:
(*a)->bf=0;
rc->bf=-1;
break;
case 0 :
(*a)->bf=rc->bf=0;
break;
case -1 :
(*a)->bf=1;
rc->bf=0;
break;
}
ld->bf=0;
R_Rotate(&((*a)->right));
L_Rotate(a);
}
}
int InsertAVL(BSTNode **base , DataType e,int taller)
{
//add your code
if(*base==NULL)
{
*base=(BSTNode *)malloc(sizeof(BSTNode));
(*base)->left=(*base)->right=NULL;
(*base)->data=e;
(*base)->bf=0;
taller=1;
}
else
{
if(e==(*base)->data)
{
taller=0;
return 0;
}
else if(e<(*base)->data)
{
if(!InsertAVL(&((*base)->left),e,taller))
return 0;
if(taller)
{
switch((*base)->bf)
{
case 1:
LeftBalance(base);
taller=0;
break;
case 0 :
(*base)->bf=1;
taller=1;
break;
case -1:
(*base)->bf=0;
taller=0;
break;
}
}
}
else
{
if(!InsertAVL(&((*base)->right),e,taller))
return 0;
if(taller)
{
switch((*base)->bf)
{
case 1:
(*base)->bf=0;
taller=0;
break;
case 0:
(*base)->bf=-1;
taller=1;
break;
case -1:
RightBalance(base);
taller=0;
break;
}
}
}
}
return 1;
}
int Delete(BSTNode **a , DataType key)
{
//add your code
if(*a==NULL)
return 0;
/*when find the key ,begin to delete it.*/
if((*a)->data==key)
{
//to add your code
}
}
bstree.h
typedef int DataType;
struct bstnode
{
DataType data;
int bf ;
int visited;
struct bstnode *left,*right;
};
typedef struct bstnode BSTNode;
void R_Rotate(BSTNode **a);
void L_Rotate(BSTNode **a);
void LeftBalance(BSTNode **a);
void RightBalance(BSTNode **a);
int InsertAVL(BSTNode **base,DataType key,int taller);
int Delete(BSTNode **a , DataType key);
[/code]