zoukankan      html  css  js  c++  java
  • 算法(6) —— AVL树

    AVL树二叉查找树的一种,所以其操作和二叉查找树的很多操作是相同的。

    1. 

     1 #ifndef AVLTREE_H
     2 #define AVLTREE_H
     3 
     4 struct AvlNode;
     5 typedef struct AvlNode *Position;
     6 typedef struct AvlNode *AvlTree;
     7 
     8 typedef int ElementType;
     9 
    10 
    11 AvlTree MakeEmpty( AvlTree T );
    12 Position Find( ElementType X, AvlTree T );
    13 Position FindMin( AvlTree T );
    14 Position FindMax( AvlTree T );
    15 AvlTree Insert( ElementType X, AvlTree T );
    16 AvlTree Delete( ElementType X, AvlTree T );
    17 ElementType Retrieve( Position P );
    18 
    19 #endif 
    avltree.h

    2.

      1 #include "avltree.h"
      2 #include <stdlib.h>
      3 #include "fatal.h"
      4 
      5 struct AvlNode  {
      6     ElementType Element;
      7     AvlTree  Left;
      8     AvlTree  Right;
      9     int      Height;
     10 };
     11 
     12 AvlTree  MakeEmpty( AvlTree T )   {
     13     if( T != NULL )
     14     {
     15         MakeEmpty( T->Left );
     16         MakeEmpty( T->Right );
     17         free( T );
     18     }
     19     return NULL;
     20 }
     21 
     22 Position  Find( ElementType X, AvlTree T )  {
     23     if( T == NULL )
     24         return NULL;
     25     if( X < T->Element )
     26         return Find( X, T->Left );
     27     else if( X > T->Element )
     28         return Find( X, T->Right );
     29     else
     30         return T;
     31 }
     32 
     33 Position  FindMin( AvlTree T )  {
     34     if( T == NULL )
     35         return NULL;
     36     else if( T->Left == NULL )
     37         return T;
     38     else return FindMin( T->Left );
     39 }
     40 
     41 Position  FindMax( AvlTree T )  {
     42     if( T != NULL )
     43         while( T->Right != NULL )
     44             T = T->Right;
     45 
     46     return T;
     47 }
     48 
     49 /* START: fig4_36.txt */
     50 static int  Height( Position P )  {
     51     if( P == NULL )
     52         return -1;
     53     else
     54         return P->Height;
     55 }
     56 /* END */
     57 
     58 static int  Max( int Lhs, int Rhs )  {
     59     return Lhs > Rhs ? Lhs : Rhs;
     60 }
     61 
     62 /* START: fig4_39.txt */
     63 /* This function can be called only if K2 has a left child K1 */
     64 /* Perform a rotate between a node (K2) and its left child */
     65 /* Update heights, then return new root k1*/
     66 
     67 static Position
     68 SingleRotateWithLeft( Position K2 )  {
     69     Position K1;
     70 
     71     K1 = K2->Left;
     72     K2->Left = K1->Right;
     73     K1->Right = K2;
     74 
     75     K2->Height = Max( Height( K2->Left ), Height( K2->Right ) ) + 1;
     76     K1->Height = Max( Height( K1->Left ), K2->Height ) + 1;
     77 
     78     return K1;  /* New root */
     79 }
     80 /* END */
     81 
     82 /* This function can be called only if K1 has a right child */
     83 /* Perform a rotate between a node (K1) and its right child */
     84 /* Update heights, then return new root */
     85 
     86 static Position  SingleRotateWithRight( Position K1 )  {
     87     Position K2;
     88 
     89     K2 = K1->Right;
     90     K1->Right = K2->Left;
     91     K2->Left = K1;
     92 
     93     K1->Height = Max( Height( K1->Left ), Height( K1->Right ) ) + 1;
     94     K2->Height = Max( Height( K2->Right ), K1->Height ) + 1;
     95 
     96     return K2;  /* New root */
     97 }
     98 
     99 /* START: fig4_41.txt */
    100 /* This function can be called only if K3 has a left */
    101 /* child and K3's left child has a right child */
    102 /* Do the left-right double rotation */
    103 /* Update heights, then return new root */
    104 
    105 static Position  DoubleRotateWithLeft( Position K3 )   {
    106     /* Rotate between K1 and K2 */
    107     K3->Left = SingleRotateWithRight( K3->Left );
    108 
    109     /* Rotate between K3 and K2 */
    110     return SingleRotateWithLeft( K3 );
    111 }
    112 /* END */
    113 
    114 /* This function can be called only if K1 has a right */
    115 /* child and K1's right child has a left child */
    116 /* Do the right-left double rotation */
    117 /* Update heights, then return new root */
    118 
    119 static Position  DoubleRotateWithRight( Position K1 )    {
    120     /* Rotate between K3 and K2 */
    121     K1->Right = SingleRotateWithLeft( K1->Right );
    122 
    123     /* Rotate between K1 and K2 */
    124     return SingleRotateWithRight( K1 );
    125 }
    126 
    127 
    128 AvlTree  Insert( ElementType X, AvlTree T )  {
    129     if( T == NULL )  {
    130         T = malloc( sizeof( struct AvlNode ) );
    131         if( T == NULL )
    132             FatalError( "Out of space!!!" );
    133         else     {
    134             T->Element = X; T->Height = 0;
    135             T->Left = T->Right = NULL;
    136         }
    137     }
    138     else  if(X < T->Element )  {
    139         T->Left = Insert( X, T->Left );
    140         if( Height( T->Left ) - Height( T->Right ) == 2 )
    141             if( X < T->Left->Element )
    142                 T = SingleRotateWithLeft( T );
    143             else
    144                 T = DoubleRotateWithLeft( T );
    145     }
    146     else  if( X > T->Element )    {
    147         T->Right = Insert( X, T->Right );
    148         if( Height( T->Right ) - Height( T->Left ) == 2 )
    149             if( X > T->Right->Element )
    150                 T = SingleRotateWithRight( T );
    151             else
    152                 T = DoubleRotateWithRight( T );
    153     }
    154     T->Height = Max( Height( T->Left ), Height( T->Right ) ) + 1;
    155     return T;
    156 }
    157 
    158 AvlTree    Delete( ElementType X, AvlTree T )  {
    159     printf( "Sorry; Delete is unimplemented; %d remains
    ", X );
    160     return T;
    161 }
    162 
    163 ElementType Retrieve( Position P )  {
    164     return P->Element;
    165 }
    avltree.c

    3.

     1 #include "avltree.c"
     2 #include <stdio.h>
     3 
     4 void PrintTree( AvlTree T)  {
     5     if (T != NULL) {
     6         PrintTree (T -> Left);
     7     printf    ("%d
    ",Retrieve (T));
     8         PrintTree (T -> Right);
     9     }
    10 }
    11 
    12 
    13 int main(int argc, char *argv[])  {
    14     AvlTree T;
    15     Position P;
    16     int i;
    17     int j = 0;
    18 
    19     T = MakeEmpty( NULL );
    20     for( i = 0; i < 50; i += 5 )
    21         T = Insert( i, T );
    22     /*for( i = 0; i < 50; i++ )*/
    23         /*if( ( P = Find( i, T ) ) == NULL || Retrieve( P ) != i )*/
    24            /*printf( "Error at %d
    ", i );*/
    25 
    26  /* for( i = 0; i < 50; i += 2 )
    27         T = Delete( i, T );
    28 
    29     for( i = 1; i < 50; i += 2 )
    30         if( ( P = Find( i, T ) ) == NULL || Retrieve( P ) != i )
    31             printf( "Error at %d
    ", i );
    32     for( i = 0; i < 50; i += 2 )
    33         if( ( P = Find( i, T ) ) != NULL )
    34             printf( "Error at %d
    ", i );
    35 */
    36         PrintTree (T);
    37 
    38     printf( "Min is %d, Max is %d
    ", Retrieve( FindMin( T ) ),
    39                Retrieve( FindMax( T ) ) );
    40 
    41     return 0;
    42 }
    testavl.c
  • 相关阅读:
    autocomplete自动完成搜索提示仿google提示效果
    实现子元素相对于父元素左右居中
    javascript 事件知识集锦
    让 IE9 以下的浏览器支持 Media Queries
    「2013124」Cadence ic5141 installation on CentOS 5.5 x86_64 (limited to personal use)
    「2013420」SciPy, Numerical Python, matplotlib, Enthought Canopy Express
    「2013324」ClipSync, Youdao Note, GNote
    「2013124」XDMCP Configuration for Remote Access to Linux Desktop
    「2013115」Pomodoro, Convert Multiple CD ISO to One DVD ISO HowTo.
    「2013123」CentOS 5.5 x86_64 Installation and Configuration (for Univ. Labs)
  • 原文地址:https://www.cnblogs.com/hanxinle/p/7486134.html
Copyright © 2011-2022 走看看