AVL树及其实现

http://www.cnblogs.com/hustcat/archive/2008/04/13/1151586.html

引言
   平衡二叉树由于logN的时间效率,在排序和查找中有重要应用。

实现
 形态匀称的二叉树称为平衡二叉树 (Balanced binary tree) ,其严格定义是:
 一棵空树是平衡二叉树;若 T 是一棵非空二叉树,其左、右子树为 TL 和 TR ,令 hl 和 hr 分别为左、右子树的深度。当且仅当
   ①TL 、 TR 都是平衡二叉树; 
   ② | hl - hr |≤ 1;
时,则 T 是平衡二叉树。

以下是它的c代码实现,具体思想参见<<数据结构>>(严蔚敏)一书。

《AVL树及其实现》
#include 
<
stdio.h
>

《AVL树及其实现》#include 

<
malloc.h
>

《AVL树及其实现》
《AVL树及其实现》

#define
 LH  1 
//
左高

《AVL树及其实现》

#define
 EH  0 
//
等高

《AVL树及其实现》

#define
 RH  -1
//
右高 

《AVL树及其实现》

#define
 TRUE 1

《AVL树及其实现》

#define
 FALSE 0

《AVL树及其实现》
《AVL树及其实现》typedef 

int
 ElemType;
《AVL树及其实现》typedef 

struct
 BSTNode
《AVL树及其实现》

{
《AVL树及其实现》    ElemType key;
《AVL树及其实现》    
int bf;
《AVL树及其实现》    
struct BSTNode *lchild,*rchild;
《AVL树及其实现》}

BSTNode,
*
BSTree;  
//
平衡树的定义
《AVL树及其实现》

//
中序遍历

《AVL树及其实现》

void
 InOrderTraverse(BSTree root)
《AVL树及其实现》

{
《AVL树及其实现》    
if(root)
《AVL树及其实现》    
{
《AVL树及其实现》        InOrderTraverse(root
->lchild);
《AVL树及其实现》        printf(
%d, ,root->key);
《AVL树及其实现》        InOrderTraverse(root
->rchild);
《AVL树及其实现》    }

《AVL树及其实现》}


《AVL树及其实现》

//
前序遍历

《AVL树及其实现》

void
 PreOrderTraverse(BSTree root)
《AVL树及其实现》

{
《AVL树及其实现》    
if(root)
《AVL树及其实现》    
{
《AVL树及其实现》        printf(
%d, ,root->key);
《AVL树及其实现》        PreOrderTraverse(root
->lchild);
《AVL树及其实现》        PreOrderTraverse(root
->rchild);
《AVL树及其实现》    }

《AVL树及其实现》}


《AVL树及其实现》

//
右旋 如图1

《AVL树及其实现》

void
 R_Rotate(BSTree 
&
p)
《AVL树及其实现》

{
《AVL树及其实现》    BSTree lc
=p->lchild;
《AVL树及其实现》    p
->lchild=lc->rchild;
《AVL树及其实现》    lc
->rchild=p;
《AVL树及其实现》    p
=lc;
《AVL树及其实现》}


《AVL树及其实现》

//
左旋

《AVL树及其实现》

void
 L_Rotate(BSTree 
&
p)
《AVL树及其实现》

{
《AVL树及其实现》    BSTree rc
=p->rchild;
《AVL树及其实现》    p
->rchild=rc->lchild;
《AVL树及其实现》    rc
->lchild=p;
《AVL树及其实现》    p
=rc;
《AVL树及其实现》}


《AVL树及其实现》

//
左平衡处理

《AVL树及其实现》

void
 LeftBalance(BSTree 
&
T)
《AVL树及其实现》

{
《AVL树及其实现》    BSTree lc
=T->lchild;
《AVL树及其实现》    
switch(lc->bf)
《AVL树及其实现》    
{
《AVL树及其实现》    
case LH:
《AVL树及其实现》        T
->bf=lc->bf=EH;
《AVL树及其实现》        R_Rotate(T);
《AVL树及其实现》        
break;
《AVL树及其实现》    
case RH:
《AVL树及其实现》        BSTree rd
=lc->rchild;
《AVL树及其实现》        
switch(rd->bf)
《AVL树及其实现》        
{
《AVL树及其实现》        
case LH:     //如图2所示
《AVL树及其实现》
            T->bf=RH;
《AVL树及其实现》            lc
->bf=EH;
《AVL树及其实现》            
break;
《AVL树及其实现》        
case EH:
《AVL树及其实现》            T
->bf=lc->bf=EH;
《AVL树及其实现》            
break;
《AVL树及其实现》        
case RH:
《AVL树及其实现》            T
->bf=EH;
《AVL树及其实现》            lc
->bf=LH;
《AVL树及其实现》            
break;
《AVL树及其实现》        }

《AVL树及其实现》        rd
->bf=EH;
《AVL树及其实现》        L_Rotate(T
->lchild);//先左旋
《AVL树及其实现》
        R_Rotate(T);//右旋
《AVL树及其实现》
        break;
《AVL树及其实现》    }

《AVL树及其实现》}


《AVL树及其实现》

//
右平衡处理

《AVL树及其实现》

void
 RightBalance(BSTree 
&
T)
《AVL树及其实现》

{
《AVL树及其实现》    BSTree rc
=T->rchild;
《AVL树及其实现》    
switch(rc->bf)
《AVL树及其实现》    
{
《AVL树及其实现》    
case RH:
《AVL树及其实现》        T
->bf=rc->bf=EH;
《AVL树及其实现》        L_Rotate(T);
《AVL树及其实现》        
break;
《AVL树及其实现》    
case LH:
《AVL树及其实现》        BSTree ld
=rc->lchild;
《AVL树及其实现》        
switch(ld->bf)
《AVL树及其实现》        
{
《AVL树及其实现》        
case RH:
《AVL树及其实现》            T
->bf=LH;
《AVL树及其实现》            rc
->bf=EH;
《AVL树及其实现》            
break;
《AVL树及其实现》        
case EH:
《AVL树及其实现》            T
->bf=rc->bf=EH;
《AVL树及其实现》            
break;
《AVL树及其实现》        
case LH:
《AVL树及其实现》            T
->bf=EH;
《AVL树及其实现》            rc
->bf=RH;
《AVL树及其实现》            
break;
《AVL树及其实现》        }

《AVL树及其实现》        ld
->bf=EH;
《AVL树及其实现》        R_Rotate(T
->rchild);
《AVL树及其实现》        L_Rotate(T);
《AVL树及其实现》        
break;
《AVL树及其实现》    }

《AVL树及其实现》}


《AVL树及其实现》

//
在平衡二叉排序树中插入一个结点

《AVL树及其实现》

int
 InsertAVL(BSTree 
&
t,ElemType e,
bool
 
&
taller)
《AVL树及其实现》

{
《AVL树及其实现》    
if(!t)
《AVL树及其实现》    
{
《AVL树及其实现》        t
=(BSTree)malloc(sizeof(BSTNode));
《AVL树及其实现》        t
->key=e;
《AVL树及其实现》        t
->lchild=t->rchild=NULL;
《AVL树及其实现》        t
->bf=EH;
《AVL树及其实现》        taller
=TRUE;
《AVL树及其实现》    }

《AVL树及其实现》    
else
《AVL树及其实现》    
{
《AVL树及其实现》        
if(e==t->key)
《AVL树及其实现》        
{
《AVL树及其实现》            taller
=FALSE;
《AVL树及其实现》            
return 0;
《AVL树及其实现》        }

《AVL树及其实现》        
if(e<t->key)
《AVL树及其实现》        
{
《AVL树及其实现》            
if(!InsertAVL(t->lchild,e,taller))
《AVL树及其实现》                
return 0;          //未插入
《AVL树及其实现》
            if(taller)
《AVL树及其实现》            
{
《AVL树及其实现》                
switch(t->bf)
《AVL树及其实现》                
{
《AVL树及其实现》                
case LH:
《AVL树及其实现》                    LeftBalance(t);
《AVL树及其实现》                    taller
=FALSE;
《AVL树及其实现》                    
break;
《AVL树及其实现》                
case EH:
《AVL树及其实现》                    t
->bf=LH;
《AVL树及其实现》                    taller
=TRUE;
《AVL树及其实现》                    
break;
《AVL树及其实现》                
case RH:
《AVL树及其实现》                    t
->bf=EH;
《AVL树及其实现》                    taller
=FALSE;
《AVL树及其实现》                    
break;
《AVL树及其实现》                }

《AVL树及其实现》            }

《AVL树及其实现》        }

《AVL树及其实现》        
else
《AVL树及其实现》        
{
《AVL树及其实现》            
if(!InsertAVL(t->rchild,e,taller))
《AVL树及其实现》                
return 0;          //未插入
《AVL树及其实现》
            if(taller)
《AVL树及其实现》            
{
《AVL树及其实现》                
switch(t->bf)
《AVL树及其实现》                
{
《AVL树及其实现》                
case RH:
《AVL树及其实现》                    RightBalance(t);
《AVL树及其实现》                    taller
=FALSE;
《AVL树及其实现》                    
break;
《AVL树及其实现》                
case EH:
《AVL树及其实现》                    t
->bf=RH;
《AVL树及其实现》                    taller
=TRUE;
《AVL树及其实现》                    
break;
《AVL树及其实现》                
case LH:
《AVL树及其实现》                    t
->bf=EH;
《AVL树及其实现》                    taller
=FALSE;
《AVL树及其实现》                    
break;
《AVL树及其实现》                }

《AVL树及其实现》            }

《AVL树及其实现》        }

《AVL树及其实现》    }

《AVL树及其实现》    
return 1;
《AVL树及其实现》}


《AVL树及其实现》

//
查找key,若没找到,则返回NULL

《AVL树及其实现》

BSTree Search(BSTree t,ElemType key)
《AVL树及其实现》

{
《AVL树及其实现》     BSTree p
=t;
《AVL树及其实现》     
while(p)
《AVL树及其实现》     
{
《AVL树及其实现》         
if(p->key==key)
《AVL树及其实现》             
return p;
《AVL树及其实现》         
else if(p->key<key)
《AVL树及其实现》             p
=p->rchild;
《AVL树及其实现》         
else
《AVL树及其实现》             p
=p->lchild;
《AVL树及其实现》     }

《AVL树及其实现》     
return p;
《AVL树及其实现》}


《AVL树及其实现》

/**/

《AVL树及其实现》

int
 main(
int
 argc,
char
 
*
argv[])
《AVL树及其实现》

{
《AVL树及其实现》    BSTree root
=NULL,r;
《AVL树及其实现》    
bool taller=FALSE;
《AVL树及其实现》    
int array[]={13,24,37,90,53};
《AVL树及其实现》    
for(int i=0;i<5;i++)
《AVL树及其实现》        InsertAVL(root,array[i],taller);
《AVL树及其实现》    printf(
inorder traverse《AVL树及其实现》\n);
《AVL树及其实现》    InOrderTraverse(root);
《AVL树及其实现》
《AVL树及其实现》    printf(
\npreorder traverse《AVL树及其实现》\n);
《AVL树及其实现》    PreOrderTraverse(root);
《AVL树及其实现》
《AVL树及其实现》    printf(
\nsearch key《AVL树及其实现》\n);
《AVL树及其实现》    r
=Search(root,37);
《AVL树及其实现》    
if(r)
《AVL树及其实现》    
{
《AVL树及其实现》        printf(
%d\n,r->key);
《AVL树及其实现》    }

《AVL树及其实现》    
else
《AVL树及其实现》    
{
《AVL树及其实现》        printf(
not find!\n);
《AVL树及其实现》    }

《AVL树及其实现》}

《AVL树及其实现》

图1.

《AVL树及其实现》

图2

输出结果如下:

《AVL树及其实现》

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