04-树5- Root of AVL Tree

来源:互联网 发布:淘宝1分钱抢购在哪 编辑:程序博客网 时间:2024/05/21 08:43

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 resulting AVL tree.

Input Specification
Each input file contains one test case,for each case the first line 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.

#include<stdio.h>#include<stdlib.h>#define ElementType inttypedef struct AVLNode *Position;typedef Position AVLTree;typedef struct AVLNode{    ElementType 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 0;    else        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), A->Height ) + 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),A->Height) + 1;     return B;}AVLTree DoubleLeftRightRotation ( AVLTree A ){    A->Left = SingleRightRotation(A->Left);    return SingleLeftRotation(A); }AVLTree DoubleRightLeftRotation(AVLTree A){    A->Right = SingleLeftRotation(A->Right);    return SingleRightRotation(A); }AVLTree Insert( AVLTree T, ElementType X ){ /* 将X插入AVL树T中,并且返回调整后的AVL树 */    if ( !T ) { /* 若插入空树,则新建包含一个结点的树 */        T = (AVLTree)malloc(sizeof(struct AVLNode));        T->Data = X;        T->Height = 0;        T->Left = T->Right = NULL;    } /* if (插入空树) 结束 */    else if ( X < T->Data ) {        /* 插入T的左子树 */        T->Left = Insert( T->Left, X);        /* 如果需要左旋 */        if ( GetHeight(T->Left)-GetHeight(T->Right) == 2 )            if ( X < T->Left->Data )                T = SingleLeftRotation(T);      /* 左单旋 */            else                T = DoubleLeftRightRotation(T); /* 左-右双旋 */    } /* else if (插入左子树) 结束 */    else if ( X > T->Data ) {        /* 插入T的右子树 */        T->Right = Insert( T->Right, X );        /* 如果需要右旋 */        if ( GetHeight(T->Left)-GetHeight(T->Right) == -2 )            if ( X > T->Right->Data )                T = SingleRightRotation(T);     /* 右单旋 */            else                T = DoubleRightLeftRotation(T); /* 右-左双旋 */    } /* else if (插入右子树) 结束 */    /* else X == T->Data,无须插入 */    /* 别忘了更新树高 */    T->Height = Max( GetHeight(T->Left), GetHeight(T->Right) ) + 1;    return T;}int main(){    int N,key;    AVLTree tree = NULL;    scanf("%d",&N);    for(int i=0;i<N;i++)    {        scanf("%d",&key);        tree = Insert(tree,key);    }    printf("%d",tree->Data);    return 0;}
0 0