7-6 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.

F1.jpg

F2.jpg

F3.jpg

F4.jpg

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

答案(C Source Code)

主要是参照何钦铭老师mooc上教的LL-左单旋,RR-右单旋,LR-左右双旋,RL-右左双旋方法

#include <stdio.h>
#include <stdlib.h>
typedef struct AVLNode* Position;
typedef Position AVLTree; 
struct AVLNode{
    int data;
    AVLTree left;
    AVLTree right;
    int height;
};

int GetHeight(AVLTree A){
    if(A==NULL)return -1;
    else return A->height;
}

int Max(int a,int b){
    return a>b?a:b;
}

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(A->height,GetHeight(B->left))+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(A->height,GetHeight(B->right))+1;
    return B;
}

AVLTree DoubleRightLeftRotation(AVLTree A){
    A->right=SingleLeftRotation(A->right);
    return SingleRightRotation(A);
}

AVLTree DoubleLeftRightRotation(AVLTree A){
    A->left=SingleRightRotation(A->left);
    return SingleLeftRotation(A);
}

AVLTree Insert(AVLTree A,int x){
    if(A==NULL){
        A=(AVLTree)malloc(sizeof(struct AVLNode));
        A->data=x;
        A->left=NULL;
        A->right=NULL;
        A->height=0;
    }else if(x>A->data){
        A->right=Insert(A->right,x);
        if(GetHeight(A->right)-GetHeight(A->left)==2){
            if(x>A->right->data){
                A=SingleRightRotation(A);
            }else{
                A=DoubleRightLeftRotation(A);
            }
        }
    }else if(x<A->data){
        A->left=Insert(A->left,x);
        if(GetHeight(A->left)-GetHeight(A->right)==2){
            if(x<A->left->data){
                A=SingleLeftRotation(A);
            }else{
                A=DoubleLeftRightRotation(A);
            }
        }
    }
    A->height=Max(GetHeight(A->left),GetHeight(A->right))+1;
    return A;
}

int main(){
    int N;
    int i;
    AVLTree T=NULL;
    int x;
    scanf("%d",&N);
    for(i=0;i<N;i++){
        scanf("%d",&x);
        T=Insert(T,x);
        
    }
    printf("%d",T->data);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值