AVL树 实现代码!

来源:互联网 发布:sublime json 高亮 编辑:程序博客网 时间:2024/05/21 19:37
/*
 * 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;
}
原创粉丝点击