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)详解

1. 为什么平衡树? 在二叉搜索树(BST,Binary Search Tree)中提到,BST树可能会退化成一个链表(整棵树中只有左子树,或者只有右子树),这将大大影响二叉树的性能。 前苏联科学家G...
  • Chinamming
  • Chinamming
  • 2013年11月23日 00:12
  • 1335

java数据结构与算法之平衡二叉树(AVL树)的设计与实现

【版权申明】未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53892797 出自...
  • javazejian
  • javazejian
  • 2016年12月31日 23:40
  • 7951

平衡二叉搜索树(AVL树)的原理及实现源代码(有图文详解和C++、Java实现代码)

这几天学习了AVL树(平衡二叉搜索树),遂写一篇总结与大家分享。包括五个部分: 一、AVL树(平衡二叉搜索树)是什么? 二、为什么要用AVL树? 三、AVL树的实现原理 四、完整的实现代码(C++和J...
  • u013149325
  • u013149325
  • 2014年11月22日 21:46
  • 1655

请要相信我,30分钟让你掌握AVL树(平衡二叉树)

平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。 平衡因子(bf):结点的左子...
  • u011469062
  • u011469062
  • 2013年08月15日 16:37
  • 2977

AVL树平衡因子详解

AVL树就是平衡二叉树,左子树和右子树的高度之差绝对值不超过1。 而且规定,平衡二叉树的每个节点的平衡因子只能是-1 ,1 ,0; 按照公式   平衡因子 = 右子树的高度 - 左子树...
  • Travelerwz
  • Travelerwz
  • 2016年08月11日 20:59
  • 4856

数据结构:关于AVL树的平衡旋转详解

AVL树又叫做平衡二叉树。前言部分我也有说到,AVL树的前提是二叉排序树(BST或叫做二叉搜索树)。由于在生成BST树的过程中可能会出现线型树结构,比如插入的顺序是:1, 2, 3, 4, 5, 6,...
  • u013761665
  • u013761665
  • 2015年12月28日 12:49
  • 10460

AVL树(平衡二叉树)的构造

特点:平衡二叉树要求对于每一个节点来说,他的左右子树的高度之差不超过1,如果插入或者删除一个结点使得高度之差大于1,就要进行节点之间的旋转(左旋或者右旋),将二叉树重新维持在一个平衡状态。 解决了二...
  • hello_bravo_
  • hello_bravo_
  • 2016年10月27日 19:27
  • 1573

python数据结构学习笔记-2016-12-10-01-AVL树

14.3 AVL树         AVL树由G.M.Adel‘son-Velskii和Y.M.Landis在1962年发明的自平衡二叉查找树。如果一个二叉树,其左右两子树的高度最多相差1,则称该二...
  • baidu_21088863
  • baidu_21088863
  • 2016年12月31日 18:55
  • 169

平衡二叉树 之 AVL树

AVL树的数据结构以及插入和删除操作实现...
  • whucyl
  • whucyl
  • 2013年12月12日 22:22
  • 20615

AVL树详解&面试题-判断一棵树是否是平衡二叉树

上次写了关于二叉搜索树的分析,但是二叉搜索树有一个缺陷,就是当插入一个有序(或接近有序)的序列时,二叉搜索树就相当于一个链表了,搜索效率会特别低。那么,如何来改进呢?这就引入了AVL树(高度平衡二叉树...
  • her__0_0
  • her__0_0
  • 2017年06月24日 22:57
  • 1050
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AVL平衡树的实现
举报原因:
原因补充:

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