• 04-树5 Root of AVL Tree


    平衡二叉树

    LL RR LR RL 注意画图理解法

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.

    Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.

    Input Specification:

    Each input file contains one test case. For each case, the first line contains a positive integer N (20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.

    Output Specification:

    For each test case, print the root of the resulting AVL tree in one line.

    Sample Input 1:

    5
    88 70 61 96 120
    

    Sample Output 1:

    70
    

    Sample Input 2:

    7
    88 70 61 96 120 90 65
    

    Sample Output 2:

    88
      1 //平衡二叉树 AVL 
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 
      5 typedef int ElementType;
      6 
      7 typedef struct AVLNode *Position;
      8 typedef Position AVLTree; /* AVL树类型 */
      9 typedef struct AVLNode{
     10     ElementType data; /* 结点数据 */
     11     AVLTree left;     /* 指向左子树 */
     12     AVLTree right;    /* 指向右子树 */
     13     int height;       /* 树高 */
     14 };
     15  
     16 int Max ( int a, int b )
     17 {
     18     return a > b ? a : b;
     19 }
     20 
     21 int GetHeight( Position p )
     22 {
     23     if(!p)
     24         return -1;
     25     return p->height;
     26 }
     27 
     28 /* 将A与B做左单旋,更新A与B的高度,返回新的根结点B */ 
     29 /* 注意:A必须有一个左子结点B */    
     30 AVLTree SingleLeftRotation ( AVLTree A )
     31 {
     32     AVLTree B = A->left;
     33     A->left = B->right;
     34     B->right = A;
     35     A->height = Max( GetHeight(A->left), GetHeight(A->right) ) + 1;
     36     B->height = Max( GetHeight(B->left), A->height ) + 1;
     37   
     38     return B;
     39 }
     40 /* 将A与B做右单旋,更新A与B的高度,返回新的根结点B */ 
     41 /* 注意:A必须有一个右子结点B */
     42 AVLTree SingleRightRotation ( AVLTree A )
     43 { 
     44     AVLTree B = A->right;
     45     A->right = B->left;
     46     B->left = A;
     47     A->height = Max( GetHeight(A->left), GetHeight(A->right) ) + 1;
     48     B->height = Max( A->height, GetHeight(B->right) ) + 1;
     49   
     50     return B;
     51 }
     52 
     53 /* 注意:A必须有一个左子结点B,且B必须有一个右子结点C */
     54 /* 将A、B与C做两次单旋,返回新的根结点C */ 
     55 AVLTree DoubleLeftRightRotation ( AVLTree A )
     56 { 
     57     /* 将B与C做右单旋,C被返回 */
     58     A->left = SingleRightRotation(A->left);
     59     /* 将A与C做左单旋,C被返回 */
     60     return SingleLeftRotation(A);
     61 }
     62 
     63 /* 将A、B与C做两次单旋,返回新的根结点C */ 
     64 /* 注意:A必须有一个右子结点B,且B必须有一个左子结点C */
     65 AVLTree DoubleRightLeftRotation ( AVLTree A )
     66 { 
     67     /* 将B与C做右单旋,C被返回 */
     68     A->right = SingleLeftRotation(A->right);
     69     /* 将A与C做左单旋,C被返回 */
     70     return SingleRightRotation(A);
     71 }
     72 
     73 /* 将X插入AVL树T中,并且返回调整后的AVL树 */
     74 AVLTree Insert( AVLTree T, ElementType X )
     75 { 
     76     if ( !T ) { /* 若插入空树,则新建包含一个结点的树 */
     77         T = (AVLTree)malloc(sizeof(struct AVLNode));
     78         T->data = X;
     79         T->height = 0;
     80         T->left = T->right = NULL;
     81     } /* if (插入空树) 结束 */
     82  
     83     else if ( X < T->data ) {
     84         T->left = Insert( T->left, X);/* 插入T的左子树 */
     85         if ( GetHeight(T->left)-GetHeight(T->right) == 2 ) /* 如果需要左旋 */
     86             if ( X < T->left->data ) 
     87                T = SingleLeftRotation(T);      //左单旋 LL
     88             else 
     89                T = DoubleLeftRightRotation(T); //左-右双旋LR
     90     } /* else if (插入左子树) 结束 */
     91      
     92     else if ( X > T->data ) {
     93         T->right = Insert( T->right, X );/* 插入T的右子树 */
     94         if ( GetHeight(T->left)-GetHeight(T->right) == -2 )/* 如果需要右旋 */
     95             if ( X > T->right->data ) 
     96                T = SingleRightRotation(T);     //右单旋 RR
     97             else 
     98                T = DoubleRightLeftRotation(T); //右-左双旋 RL
     99     } /* else if (插入右子树) 结束 */
    100  
    101     /*else X == T->Data,无须插入 */
    102     T->height = Max( GetHeight(T->left), GetHeight(T->right) ) + 1;    //更新树高 
    103      
    104     return T;
    105 }
    106 
    107 int main()
    108 {
    109     int N, data;
    110     AVLTree T;
    111     scanf("%d",&N);
    112     for(int i = 0; i < N; i++) {
    113         scanf("%d",&data);
    114         T = Insert(T,data);
    115     }
    116     printf("%d
    ",T->data);
    117     return 0;
    118 }
     
     
  • 相关阅读:
    征战蓝桥 —— 2015年第六届 —— C/C++A组第5题——九数组分数
    征战蓝桥 —— 2015年第六届 —— C/C++A组第5题——九数组分数
    征战蓝桥 —— 2015年第六届 —— C/C++A组第4题——格子中输出
    SSLZYC 邮票
    SSLZYC 道路阻塞
    SSLZYC 反射
    SSLZYC 家族
    秒杀系统架构分析与实战
    工厂模式
    工厂模式
  • 原文地址:https://www.cnblogs.com/kuotian/p/5321634.html
Copyright © 2020-2023  润新知