/*
* AVL_lib.c
*
* Created on: May 12, 2013
* Author: Administrator
*/
#include “AVL_lib.h”
#include <stdio.h>
#include <stdlib.h>
/************************************************************************/
/* 清空AVL树的操作与清空普通二叉树相同 */
/************************************************************************/
AvlTree MakeEmpty(AvlTree T)
{
if (!T)
{
MakeEmpty(T->Left);
MakeEmpty(T->Right);
free(T);
}
return NULL;
}
/************************************************************************/
/*在Avl树中查找指定的元素,与二叉查找树的操作相同 */
/************************************************************************/
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;
}
}
}
/************************************************************************/
/* 在Avl树中查找最大值(递归写法) */
/************************************************************************/
Position FindMax(AvlTree T)
{
if (T == NULL)
{
return NULL;
}
else
{
if (T->Right == NULL)
{
return NULL;
}
else
{
return FindMax(T->Right);
}
}
}
/************************************************************************/
/* 在Avl树中查找最小值(非递归写法) */
/************************************************************************/
Position FindMin(AvlTree T)
{
if (T == NULL)
{
return NULL;
}
else
{
while (T->Left != NULL)
{
T = T->Left;
}
return T;
}
}
/************************************************************************/
/* 返回指定节点的高度信息 */
/************************************************************************/
int Height(Position P)
{
if (P == NULL)
{
return -1;
}
else
{
return P->Height;
}
}
/************************************************************************/
/* 单旋转:右旋转 */
/* 使用条件:这个函数只适合当P有左子树时调用; */
/* 作用:在P和其左子树根节点之间执行一次单右旋转 */
/************************************************************************/
Position SingleRotateWithLeft(Position P)
{
Position LChild = P->Left;
P->Left = LChild->Right; /*将P的左孩子设置成LChild的右孩子*/
LChild->Right = P;
P->Height = MAX(Height(P->Left),Height(P->Right)) + 1;/*更新高度信息*/
LChild->Height = MAX(Height(LChild->Left),P->Height) + 1;
return LChild; /*新的根节点*/
}
/************************************************************************/
/* 单旋转:左旋转 */
/* 使用条件:这个函数只适合当P有右子树时调用; */
/* 作用:在P和其右子树根节点之间执行一次单左旋转 */
/************************************************************************/
Position SingleRotateWithRight(Position P)
{
Position RChild = P->Right; /*将P的右孩子设置成RChild的右孩子*/
P->Right = RChild->Left;
RChild->Left = P;
P->Height = MAX(Height(P->Left),Height(P->Right)) + 1;/*更新高度信息*/
RChild->Height = MAX(Height(RChild->Right),P->Height) + 1;
return RChild; /*新的根节点*/
}
/************************************************************************/
/* 双旋转:左右旋转 */
/* 使用条件:适合于当P有左孩子,而左孩子有右孩子 */
/* 作用:*/
/************************************************************************/
Position DoubleRotateWithLeft(Position P)
{
P->Left = SingleRotateWithRight(P->Left); /*先进行左旋转*/
return SingleRotateWithLeft(P); /*再进行又旋转*/
}
/************************************************************************/
/* 双旋转:右左旋转 */
/* 使用条件:适合于当P有右孩子,而右孩子有左孩子 */
/* 作用:*/
/************************************************************************/
Position DoubleRotateWithRight(Position P)
{
P->Right = SingleRotateWithLeft(P->Right); /*先进行右旋转*/
return SingleRotateWithRight(P); /*再进行左旋转*/
}
/************************************************************************/
/* AVL树插入操作 */
/************************************************************************/
AvlTree Insert(ElementType X, AvlTree T)
{
/*如果T是一棵空树,那么创建一个节点作为树的根节点*/
if (T == NULL)
{
T = malloc(sizeof(struct AvlNode));
if(T == NULL)
{
fprintf(stderr,”Out of space!”);
}
else
{
T->Element = X;
T->Left = NULL;
T->Right = NULL;
T->Height = 0;
}
}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 if (X > T->Left->Element)
{
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 = DoubleRotateWithRight(T);
}
else if (X > T->Right->Element)
{
T = SingleRotateWithRight(T);
}
}
}
else
{
/*元素已经存在于AVL树中,因此不需要再做别的工作*/
}
/*更新数的高度信息*/
T->Height = MAX(Height(T->Left),Height(T->Right)) + 1;
}
return T;
}