• 04-树5 Root of AVL Tree (25分)


    04-树5 Root of AVL Tree (25分)

    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 (≤) 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

    提交代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int ElemType;
    typedef struct AVLNode *Position;
    typedef Position AVLTree;
    struct AVLNode{
        ElemType Data;
        AVLTree Left;
        AVLTree Right;
        int Height;
    };
    
    int Max(int a, int b){
        return a > b ? a : b;
    }
    
    int GetHeight(AVLTree T){
        if(!T){
            return -1;
        }
        return T->Height;
    }
    
    AVLTree SingleLeftRotation( AVLTree A ){
        AVLTree B = A->Left;
        A->Left = B->Right;
        B->Right = A;
        A->Height = Max( GetHeight(A->Left), GetHeight(A->Right)) + 1;
        B->Height = Max( GetHeight(B->Left), GetHeight(B->Right)) + 1;
        return B;
    }
    
    AVLTree SingleRightRotation( AVLTree A ){
        AVLTree B = A->Right;
        A->Right = B->Left;
        B->Left = A;
        A->Height = Max( GetHeight(A->Left), GetHeight(A->Right)) + 1;
        B->Height = Max( GetHeight(B->Left), GetHeight(B->Right)) + 1;
        return B;
    }
    
    AVLTree DoubleLeftRotation( AVLTree A ){
        A->Left = SingleRightRotation(A->Left);
        return SingleLeftRotation(A);
    }
    
    AVLTree DoubleRightRotation( AVLTree A ){
        A->Right = SingleLeftRotation(A->Right);
        return SingleRightRotation(A);
    }
    
    AVLTree Insert( AVLTree T, ElemType X ){
        if(!T){
            T = (AVLTree)malloc(sizeof(struct AVLNode));
            T->Data = X;
            T->Height = 0;
            T->Left = NULL;
            T->Right = NULL;
        }
        else if( X < T->Data ){
            T->Left = Insert( T->Left, X );
            if( GetHeight(T->Left) - GetHeight(T->Right) == 2){
                if( X < T->Left->Data){
                    T = SingleLeftRotation(T);
                }else{
                    T = DoubleLeftRotation(T);
                }
            }
        }
        else if( X > T->Data){
            T->Right = Insert(T->Right, X);
            if(GetHeight(T->Left) - GetHeight(T->Right) == -2){
                if( X > T->Right->Data){
                    T = SingleRightRotation(T);
                }else{
                    T = DoubleRightRotation(T);
                }
            }
        }
        T->Height = Max( GetHeight(T->Left), GetHeight(T->Right)) + 1;
        return T;
    }
    
    int main(){
        int N, X;
        AVLTree T = NULL;
        scanf("%d", &N);
        for(int i = 0; i < N; ++i){
            scanf("%d", &X);
            T = Insert(T, X);
        }
        printf("%d", T->Data);
        return 0;
    }

    提测结果:

  • 相关阅读:
    POJ1470 Closest Common Ancestors(LCA入门)
    POJ1330 Nearest Common Ancestors(倍增LCA算法求无边权树的模板)
    HDU3078 Network (倍增LCA算法求树链)
    HDU2874 Connections between cities(并查集+倍增LCA算法求森林最短路)
    HDU2586 How far away?(倍增LCA算法求带边权树上最短路)
    POJ1062 昂贵的聘礼
    HDU4725 The Shortest Path in Nya Graph(堆优化的dijkstra算法)
    数据仓库详解:包括概念、架构及设计
    利用行为标签构建用户画像
    Spark SQL深度理解篇:模块实现、代码结构及执行流程总览(2)
  • 原文地址:https://www.cnblogs.com/2018shawn/p/13358363.html
Copyright © 2020-2023  润新知