AVL树 实现代码!

/*

 * 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;

}

    原文作者:AVL树
    原文地址: https://blog.csdn.net/hefashion0190/article/details/8918199
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞