//二叉AVL查找树
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#define ElementType int
struct AvlNode;
typedef struct AvlNode *AvlTree;
typedef struct AvlNode *Position;
//AvlTree means find a root plus,Position means return a plus in position.
AvlTree MakeEmpty(AvlTree T);
Position Find(ElementType X,AvlTree T);
Position FindMin(AvlTree T);
Position FindMax(AvlTree T);
AvlTree Insert(ElementType X,AvlTree T);
AvlTree Delete(ElementType X,AvlTree T);
//fuction
int Height(Position P);//return plus's height to balance the tree
int Max(int x,int y);
//Rotate
Position SingleRotateWithLeft(Position P);
Position SingleRotateWithRight(Position P);
Position DoubleRotateWithLeft(Position P);
Position DoubleRotateWithRight(Position P);
struct AvlNode
{
ElementType Element;
AvlTree left;
AvlTree right;
int height;//how much meter?laugh~~
};
int Height(Position P)
{
if(P==NULL)
return -1;
else
return P->height;
}
int Max(int x,int y)
{
if(x>=y)
return x;
else
return y;
}
AvlTree Insert(ElementType X,AvlTree T)
{
if(T==NULL)
{
T=(AvlTree)malloc(sizeof(struct AvlNode));
if(T==NULL)
printf("OUT OF SPACE!\n");
else
{
T->Element=X;
T->height=0;
T->left=NULL;
T->right=NULL;
}
}
else if(X<T->Element)
{
T->left=Insert(X,T->left);
if(Height(T->left)-Height(T->right)==2)
{
if(X<T->left->Element)
T=SingleRotateWithLeft(T);
else
T=DoubleRotateWithLeft(T);
}
}
else if(X>T->Element)
{
T->right=Insert(X,T->right);
if(Height(T->right)-Height(T->left)==2)
{
if(X>T->right->Element)
T=SingleRotateWithRight(T);
else
T=DoubleRotateWithRight(T);
}
}
//there not x==Element phonemeon
T->height=Max(Height(T->left),Height(T->right))+1;
return T;
}
Position SingleRotateWithLeft(Position P)
{
Position tmp;
tmp=P->left;
P->left=tmp->right;
tmp->right=P;
P->height=Max(Height(P->left),Height(P->right))+1;
tmp->height=Max(Height(tmp->left),Height(tmp->right))+1;
return tmp;
}
Position SingleRotateWithRight(Position P)
{
Position tmp;
tmp=P->right;
P->right=tmp->left;
tmp->left=P;
P->height=Max(Height(P->left),Height(P->right))+1;
tmp->height=Max(Height(tmp->left),Height(tmp->right))+1;
return tmp;
}
Position DoubleRotateWithLeft(Position P)
{
P->left=SingleRotateWithRight(P->left);
return SingleRotateWithLeft(P);
}
Position DoubleRotateWithRight(Position P)
{
P->right=SingleRotateWithLeft(P->right);
return SingleRotateWithRight(P);
}
Position Find(ElementType X,AvlTree T)
{
if(T==NULL)
return NULL;
else if(X<T->Element)
return Find(X,T->left);
else if(X>T->Element)
return Find(X,T->right);
else
return T;
}
Position FindMin(AvlTree T)
{
if(T==NULL)
return NULL;
else if(T->left==NULL)
return T;
else
return FindMin(T->left);
}
Position FindMax(AvlTree T)
{
if(T==NULL)
return NULL;
else if(T->right==NULL)
return T;
else
return FindMax(T->right);
}
AvlTree Delete(ElementType X,AvlTree T)
{
Position TmpCell;
if(T==NULL)
printf("You can't delete a NULL Tree\n");
else if(X<T->Element)
T->left=Delete(X,T->left);
else if(X>T->Element)
T->right=Delete(X,T->right);
else
{
if(T->left && T->right)
{
TmpCell=FindMin(T->right);
T->Element=TmpCell->Element;
T->right=Delete(T->Element,T->right);
}
else
{
TmpCell=T;
if(T->left==NULL)
T=T->right;
else if(T->right==NULL)
T=T->left;
free(TmpCell);
}
}
return T;
}
int main()
{
AvlTree T=NULL;
int n;
int i;
for(i=0;i<5;i++)
{
scanf("%d",&n);
T=Insert(n,T);
}
Position tmp;
int max;
int min;
tmp=FindMax(T);
max=tmp->Element;
tmp=FindMin(T);
min=tmp->Element;
printf("Max=%d Min=%d\n",max,min);
tmp=Delete(max,T);
max=FindMax(tmp)->Element;
printf("Max=%d Min=%d\n",max,min);
return 0;
}
/*
示例输入
INPUT
3 1 2 4 5
OUTPUT
Max=5 Min=1
Max=4 Min=1
Press any key to continue
*/
转载复制请说明出处。谢谢!