zoukankan      html  css  js  c++  java
  • AVL树

    C实现代码如下:

      1     
      2     /*
      3       AVL树
      4     */
      5     
      6     /*接口头文件*/
      7     typedef int ElementType;
      8     
      9     #ifndef _AVLTREE_H
     10     #define _AVLTREE_H
     11     
     12     struct AVLNode;
     13     typedef struct AVLNode * PtrToNode;
     14     typedef PtrToNode Position;
     15     typedef PtrToNode AVLTree;
     16     
     17     /*操作集*/
     18     AVLTree MakeEmpty( AVLTree T );
     19     AVLTree Insert( ElementType X, AVLTree T );
     20     AVLTree Delete( ElementType X, AVLTree T );
     21     Position Find( ElementType X, AVLTree T );
     22     Position FindMin( AVLTree T );
     23     Position FindMax( AVLTree T );
     24     ElementType Retrieve( Position P );
     25     void PrintfTree( AVLTree T );
     26     
     27     #endif
     28     
     29     
     30     /*接口实现*/
     31     #include <stdio.h>
     32     #include <stdlib.h>
     33     #include "AVLTree.h"
     34     
     35     /*特定结构体定义*/
     36     struct AVLNode
     37     {
     38         ElementType Element;
     39         AVLTree     Left;
     40         AVLTree     Right;
     41         int         Height;
     42     };
     43     
     44     int Height( Position P );
     45     int Max( int A, int B );
     46     Position SingleRotateWithLeft( Position K1 );
     47     Position SingleRotateWithRight( Position K1 );
     48     Position DoubleRotateWithLeft( Position K1 );
     49     Position DoubleRotateWithRight( Position K1 ); 
     50     
     51     AVLTree
     52     MakeEmpty( AVLTree T )
     53     {
     54         if ( T != NULL )
     55         {
     56             MakeEmpty( T->Left );
     57             MakeEmpty( T->Right );
     58             MakeEmpty( T );
     59         }
     60         
     61         return NULL;
     62     }
     63     
     64     Position
     65     Find( ElementType X, AVLTree T )
     66     {
     67         if ( T == NULL )
     68             return NULL;
     69         if ( X < T->Element )
     70             return Find( X, T->Left );
     71         else
     72         if ( X > T->Right )
     73             return Find( X, T->Right );
     74         else
     75             return T;
     76     }
     77     
     78     /*递归例程*/
     79     Position
     80     FindMin( AVLTree T )
     81     {
     82         if ( T == NULL )
     83             return NULL;
     84         if ( T->Left == NULL )
     85             return T;
     86         else
     87             return FindMin( T->Left );
     88     }
     89     
     90     /*非递归例程*/
     91     /*
     92     Position
     93     FindMin( AVLTree T 0
     94     {
     95         if ( T != NULL )
     96             while ( T->Left != NULL )
     97                 T = T->Left;
     98             
     99         return T;
    100     }
    101     */
    102     
    103     /*递归例程*/
    104     Position
    105     FindMax( AVLTree T )
    106     {
    107         if ( T == NULL )
    108             return NULL;
    109         if ( T->Right == NULL )
    110             return T;
    111         else
    112             return FindMax( T->Right );
    113     }
    114     
    115     /*非递归例程*/
    116     /*
    117     Position
    118     FindMax( AVLTree T )
    119     {
    120         if ( T != NULL )
    121             while ( T->Right 1= NULL )
    122                 T = T->Right;
    123             
    124         return T;
    125     }
    126     */
    127     
    128     ElementType
    129     Retrieve( Position P )
    130     {
    131         return P->Element;
    132     }
    133     
    134     /*中序查找,打印*/
    135     void
    136     PrintfTree( AVLTree T )
    137     {
    138         if ( T != NULL )
    139         {
    140             PrintfTree( T->Left );
    141             printf( "%3d", T->Element );
    142             PrintfTree( T->Right );
    143         }
    144     }
    145     
    146     AVLTree
    147     Insert( ElementType X, AVLTree T )
    148     {
    149         if ( T == NULL )
    150         {
    151             T = ( AVLTree )malloc( sizeof( struct AVLNode ) );
    152             if ( T == NULL )
    153             {
    154                 printf( "No Space!!!
    " );
    155                 exit( 1 );
    156             }
    157             T->Element = X;
    158             T->Height = 0;
    159             T->Left = NULL;
    160             T->Right = NULL;
    161         }
    162         
    163         if ( X < T->Element )
    164         {
    165             T->Left = Insert( X, T->Left );
    166             if ( Height( T->Left ) - Height( T->Right ) == 2 )
    167             {
    168                 if ( X < T->Left->Element )
    169                     T = SingleRotateWithLeft( T );
    170                 else
    171                     T = DoubleRotateWithLeft( T );
    172             }
    173         }
    174         else
    175         if ( X > T->Element )
    176         {
    177             T->Right = Insert( X, T->Right );
    178             if ( Height( T->Right ) - Height( T->Left ) == 2 )
    179             {
    180                 if ( X > T->Right->Element )
    181                     T = SingleRotateWithRight( T );
    182                 else
    183                     T = DoubleRotateWithRight( T );
    184             }
    185         }
    186         
    187         T->Height = Max( Height( T->Left ), Height( T->Right ) ) + 1;
    188         
    189         return T;
    190     }
    191     
    192     int
    193     Max( int A, int B )
    194     {
    195         return A > B ? A : B;
    196     }
    197     
    198     int
    199     Height( Position P )
    200     {
    201         if ( P == NULL )
    202             return -1;
    203         else
    204             return Max( Height( P->Left ), Height( P->Right ) ) + 1;
    205     }
    206     
    207     Position
    208     SingleRotateWithLeft( Position K1 )
    209     {
    210         Position K2 = K1->Left;
    211         
    212         K1->Left = K2->Right;
    213         K2->Right = K1;
    214         
    215         /*update height*/
    216         K1->Height = Height( K1 );
    217         K2->Height = Height( K2 );
    218         
    219         return K2;
    220     }
    221     
    222     Position
    223     SingleRotateWithRight( Position K1 )
    224     {
    225         Position K2 = K1->Right;
    226         
    227         K1->Right = K2->Left;
    228         K2->Left = K1;
    229         
    230         /*update height*/
    231         K1->Height = Height( K1 );
    232         K2->Height = Height( K2 );
    233         
    234         return K2;
    235     }
    236     
    237     Position
    238     DoubleRotateWithLeft( Position K1 )
    239     {
    240         Position K2 = K1->Left;
    241         Position K3 = K2->Right;
    242         
    243         K1->Left = SingleRotateWithRight( K2 );
    244         return SingleRotateWithLeft( K1 );
    245     }
    246     
    247     Position
    248     DoubleRotateWithRight( Position K1 )
    249     {
    250         Position K2 = K1->Right;
    251         Position K3 = K2->Left;
    252         
    253         K1->Right = SingleRotateWithLeft( K2 );
    254         return SingleRotateWithRight( K1 );
    255     }
    256     
    257     
    258     /*AVLTree
    259     Insert( ElementType X, AVLTree T )
    260     {
    261         if ( T == NULL )
    262         {
    263             T = ( AVLTree )malloc( sizeof( struct AVLNode ) );
    264             if ( T == NULL )
    265             {
    266                 printf( "No Space!!!
    " );
    267                 exit( 1 );
    268             }
    269             T->Element = X;
    270             T->Left = NULL;
    271             T->Right = NULL;
    272         }
    273         else if ( X < T->Element )
    274             T->Left = Insert( X, T->Left );
    275         else if ( X > T->Element )
    276             T->Right = Insert( X, T->Right );
    277         
    278         return T;
    279     }*/
  • 相关阅读:
    .net 正在中止线程
    jQuery ajax
    jQuery对checkbox的各种操作
    oracle实验39:触发器
    oracle实验21:建立简单的表,并对表进行简单的DDL操作
    oracle实验20:子查询
    oracle实验18-19:表的连接查询
    oracle实验42:编写包package
    oracle实验25:Sequence序列
    oracle实验17:分组统计函数
  • 原文地址:https://www.cnblogs.com/weixia-blog/p/7307177.html
Copyright © 2011-2022 走看看