AVL树是最老的带有平衡条件的二叉查询树,高度严格控制为 s(h) = s(h-1)+s(h-2)+1。因此符合斐波那契数列,因此容易推出它的高度上界为 1.44log(N+2)-1.328。 ADT没有给出删除操作的调整操作,删除操作的代码量稍大,可以采用惰性操作。时刻保持更新的高度信息可以使树最多失衡2的高度差,并立即被调整。其中可能会涉及四种调整操作的情况:
  1. 向左儿子的左子树插入,向右单旋转
  2. 向右儿子的右子树插入,向左单旋转
  3. 向左儿子的右子树插入,双旋转.1
  4. 向右儿子的左子树插入,双旋转.2

  容易证明,1和2情况是镜像对称的;3和4同理,但编码时要仔细区分。



#ifndef 
// _AvlTree_H

struct Avlnod;
typedef 
struct Avlnod *Position;
typedef 
struct Avlnod *AvlTree;

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 ele;
 AvlTree left;
 AvlTree right;
 
int height;
}
:

AvlTree Insert( ElementType x, AvlTree t )
{
 
ifnull == t ){
  t 
= ( AvlTree )malloc( sizeofstruct AvlNode ) );
  
ifnull == t ){
   printf(
" error ");
  }

  
else{
   t
->ele = x; t->height = 0;
   t
->left = null; t->right = null;
  }

 }

 
else{
  
if( x < t->ele ){
   t 
= Insert( x ,t->left );
   
if2 == getHeight( t->left ) - getHeight( t->right )  ){
    
if( x < t->left->ele ){
     t 
= SingleRoRight( t );
    }

    
else{
     t 
= DoubleRoRight( t );
    }

   }

  }

  
else
   
if( x > t->ele ){
    t 
= Insert( x ,t->right );
    
if2 == getHeight( t->right ) - getHeight( t->left )  ){
     
if( x > t->right->ele ){
      t 
= SingleRouLeft( t );
     }

     
else{
      t 
= DoubleRouLeft( t );
     }

    }

   }

 }

 t
->height = max( getHeight( t->left ) ,getHeight( t->right ) )+1;
 
return t;
}


AvlTree SingleRouRight( AvlTree root2 )
{
 Position root1;
 root1 
= root2->left;
 root2
->left = root1->right;
 root1
->right = root2;
 root2
->height = max( getHeight( root2->left ) ,getHeight( root2->right ) )+1;
 root1
->height = max( getHeight( root1->left ) ,getHeight( root1->right ) )+1;
 
return root1;
}


AvlTree DoubleRouRight( AvlTree root3 )
{
 Position rootTmp,root;
 rootTmp 
= root3->left;
 root3
->left = SingleRouLeft( rootTmp );   // 左旋左子树
 root = SingleRouRight( root3 );  // 右旋整体
 return root;
}


AvlTree SingleRouLeft( AvlTree root1 )
{
 Position root2;
 root2 
= root1->right;
 root1
->right = root2->left;
 root2
->left = root1;
 root1
->height = max( getHeight( root1->left ) ,getHeight( root1->right ) )+1;
 root2
->height = max( getHeight( root2->left ) ,getHeight( root2->right ) )+1;
 
return root2;
}


AvlTree DoubleRouLeft( AvlTree root3 )
{
 Position rootTmp,root;
 rootTmp 
= root3->right;
 root3
->right = SingleRouRight( rootTmp );   // 右旋右子树
 root = SingleRouLeft( root3 );  // 左旋整体
 return root;
}


#endif  // _AvlTree_H