AVL平衡树的实现

原创 2013年12月05日 13:20:00

avltree.h

#ifndef AVLTREE_H_INCLUDED
#define AVLTREE_H_INCLUDED

typedef  int ElementType;
struct  avlnode;
typedef  struct  avlnode *Position;
typedef  Position AvlTree;
struct  avlnode
{
    ElementType data;
    AvlTree  left;
    AvlTree  right;
    int  height;
};


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);
int  Height(Position  P);

Position  SingleRotateWithLeft(Position  T);
Position  SingleRotateWithRight(Position  T);
Position  DoubleRotateWithLeft(Position  T);
Position  DoubleRotateWithRight(Position  T);
int Max(int h1,int h2);

void  PreOrder(AvlTree T);
void  MidOrder(AvlTree T);
void  PosOrder(AvlTree T);



#endif // AVLTREE_H_INCLUDED

avltree.c

#include  <stdio.h>
#include  <malloc.h>
#include  "avltree.h"

int  Height(Position  P)
{
    if(P==NULL)
        return  -1;
    else
        return P->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->data)
        return Find(X,T->left);
    else if(X>T->data)
        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)
    {
        while(T->right !=NULL)
        T=T->right;
    }

    return  T;
}


AvlTree  Insert(ElementType  X,AvlTree  T)
{
    if(T==NULL)
    {
        T=(AvlTree)malloc(sizeof(struct  avlnode));
        if(T==NULL)
            printf("Error: out of space!!!");
        else
        {
            T->data=X;  T->height=0;
            T->left =T->right =NULL;
        }
    }
    else  if(X<T->data)
    {
        T->left =Insert(X,T->left);

        if(Height(T->left) - Height(T->right) ==2)
        {
            if(X<T->left->data)
                T=SingleRotateWithLeft(T);
            else
                T=DoubleRotateWithLeft(T);
        }
    }
    else if(X>T->data)
    {
        T->right =Insert(X,T->right);

        if(Height(T->right) - Height(T->left) ==2)
        {
            if(X>T->right->data)
                T=SingleRotateWithRight(T);
            else
                T=DoubleRotateWithRight(T);
        }
    }

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





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(K1->right)) +1;

    return  K1;
}


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->left) ,Height(K2->right)) +1;

    return K2;
}

Position  DoubleRotateWithLeft(Position  K3)
{
    K3->left =SingleRotateWithRight(K3->left);

    return SingleRotateWithLeft(K3);
}


Position  DoubleRotateWithRight(Position  K3)
{
    K3->right =SingleRotateWithLeft(K3->left);

    return SingleRotateWithRight(K3);
}


int Max(int h1,int h2)
{
    return h1 >h2 ? h1:h2 ;
}


void  PreOrder(AvlTree T)
{
    if(T)
    {
        printf("%d \t",T->data);
        PreOrder(T->left);
        PreOrder(T->right);
    }
}
void  MidOrder(AvlTree T)
{
     if(T)
    {
         MidOrder(T->left);
        printf("%d \t",T->data);
        MidOrder(T->right);
    }
}
void  PosOrder(AvlTree T)
{
     if(T)
    {

        PosOrder(T->left);
        PosOrder(T->right);
        printf("%d \t",T->data);
    }
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include  "avltree.c"

int main()
{
    int i ,j;
    j=0;
    AvlTree  T;
    T=MakeEmpty(NULL);

    for( i = 0; i < 50; i++, j ++ )
        T=Insert(j,T);

    PreOrder(T);
    return 0;
}
各个例程并未完全测试,欢迎各位讨论!


代码来自数据结构与算法分析


代码中参数为一级指针仍能实现对数据的改变,关键在于返回值为一指针。如返回值为void 等类型则参数需要使用二级指针。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

AVL平衡树的实现(2)

3.在树中插入元素 AvlTree Insert(int x, AvlTree &T) //插入元素 { if (T == NULL) { T = (AvlNode *)malloc(siz...

AVL平衡树(二叉搜索树 c++实现)

AVL树简介 AVL树的名字来源于它的发明作者G.M. Adelson-Velsky 和 E.M. Landis。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Se...

算法导论第十三章习题13-3——AVL树(高度平衡树)C++代码详细实现

AVL树是一种高度平衡树,对于每一个节点,其左子树的高度与右子树的高度相差之多为1。 AVL树是比红黑树更加平衡的树(红黑树中左右子树高度之比小于2)。 AVL树除了平衡性较好外,与普通的二叉查找...

AVL平衡树实现

#ifndef BELANCETREE_INCLUDED #define BELANCETREE_INCLUDED #include //#include using namespace ...

AVL平衡树及插入操作的C语言实现

源码地址:http://download.csdn.net/detail/mcu_tian/9555855 AVL平衡二叉树是一种特殊的查找树,是一种每个节点的左右子树深度不超过1。 AVL是绝对平衡...

VB.net编写的AVL平衡树

  • 2010-02-19 10:44
  • 66KB
  • 下载

AVL平衡树控件包

  • 2006-02-23 09:05
  • 30KB
  • 下载

AVL平衡树

/* 1.插入: 使用了一个s数组来保存根节点到插入节点的路线 情况: (1)空树,直接插入,return (2)关键字相同,覆盖原来的值,return (3)插入后,不失衡 那么就要拿出s...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)