【算法学习】AVL平衡二叉搜索树原理及各项操作编程实现(C语言)

#include<stdio.h>

#include "fatal.h"



struct AvlNode;

typedef struct AvlNode *Position;

typedef struct AvlNode *AvlTree;



typedef int ElementType ;



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

ElementType Retrieve(Position P);



struct AvlNode

{

    ElementType Element;

    AvlTree left;

    AvlTree right;

    int height;

};



AvlTree MakeEmpty(AvlTree T)

{

    if(T!=NULL)

    {

        MakeEmpty(T->left);

        MakeEmpty(T->right);

        free(T);

    }

    return NULL;

}



Position Find(ElementType X,AvlTree T)

{

    if(T==NULL)

        return NULL;

    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;

    if(T->left==NULL)

        return T;

    else

        return FindMin(T->left);

}



Position FindMax(AvlTree T)

{

    if(T==NULL)

        return NULL;

    if(T->right==NULL)

        return T;

    else

        return FindMax(T->right);

}



static int Height(Position P)

{

    if(P==NULL)

        return -1;

    else

        return P->height;

}



static int Max(int Lhs,int Rhs)

{

    return Lhs>Rhs?Lhs:Rhs;

}

//RR旋转

static Position SingleRotateWithLeft(Position K2)

{

    Position K1;

    K1=K2->left;

    K2->left=K1->right;

    K1->right=K2;

    K2->height=Max(Height(K2->left),Height(K2->right))+1;

    K1->height=Max(Height(K1->left),Height(K2->right))+1;

    return K1;

}

//LL旋转

static Position SingleRotateWithRight(Position K1)

{

    Position K2;

    K2=K1->right;

    K1->right=K2->left;

    K2->left=K1;

    K1->height=Max(Height(K1->left),Height(K1->right))+1;

    K2->height=Max(Height(K2->right),Height(K1->left))+1;

    return K2;

}

//LR旋转

static Position DoubleRotateWithLeft(Position K3)

{

    K3->left=SingleRotateWithRight(K3->left);



    return SingleRotateWithLeft(K3);

}



//RL旋转

static Position DoubleRotateWithRight(Position K3)

{

    K3->right=SingleRotateWithLeft(K3->right);

    return SingleRotateWithRight(K3);

}



AvlTree Insert(ElementType X,AvlTree T)

{

    if(T==NULL)

    {

        T=malloc(sizeof(struct AvlNode));

        if(T==NULL)

            FatalError("out of space!!!");

        else

        {

            T->Element=X;

            T->right=T->left=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);

        }

    }

   T->height=Max(Height(T->left),Height(T->right))+1;

   return T;

}



AvlTree Delete(ElementType X,AvlTree T)

{

    Position TmpCell;

    if(T==NULL)

        Error("Element not found");

    else if(X<T->Element)

    {

        T->left=Delete(X,T->left);

        if(Height(T->right)-Height(T->left)==2)

        {

            if(Height(T->right->left)>Height(T->right->right))

                T=DoubleRotateWithRight(T);

            else 

                T=SingleRotateWithRight(T);

        }

    }

    else if(X>T->Element)

    {

        T->right=Delete(X,T->left);

        if(Height(T->left)-Heighe(T->right)==2)

        {

            if(Heighe(T->left->right)>Height(T->left->left))

                T=DoubleRotateWithLeft(T);

            else

                T=SingleRotateWithLeft(T);

        }

    }

    //找到要删除的节点就是根节点,且根节点的左右子树都不为空

    else if(T->left&&T->right)

    {

        if(Height(T->left)>Height(T->right))

        {

            T->Element=FindMax(T->left)->Element;

            T->left=Delete(T->Element,T->left);

        }

        else

        {

            T->Element=FindMin(T->right)->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);

    }

    T->height=Max(Height(T->left),Height(T->right))+1;

    return T;

}



ElementType Retrieve(Position P)

{

    if(P==NULL)

        return -1;

    else

        return P->Element;

}

fatal.h

#include <stdio.h>

#include <stdlib.h>



#define Error( Str )        FatalError( Str )

#define FatalError( Str )   fprintf( stderr, "%s\n", Str ), exit( 1 )

 

你可能感兴趣的:(C语言)