浙大版《数据结构(第2版)》题目集练习4.2 平衡二叉树的根 (25分)

#include<stdio.h>
#include<stdlib.h>
typedef int elementtype;
typedef struct AVLNode *Position;
typedef Position AVLTree;
struct AVLNode{
    elementtype data;
    AVLTree left;
    AVLTree right;
    int H;
}; 
int max(int a,int b){
    return a>b?a:b;
}
int GetH(AVLTree T);
AVLTree LL(AVLTree A);
AVLTree RR(AVLTree A);
AVLTree LR(AVLTree A);
AVLTree RL(AVLTree A);
AVLTree Insert(AVLTree T,int k);


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


int GetH(AVLTree b){
    if(!b) return -1;
    else return b->H;
}
AVLTree LL(AVLTree A){
    AVLTree B=A->left;
    A->left=B->right;
    B->right=A;
    A->H=max(GetH(A->left),GetH(A->right)) + 1;
    B->H=max(GetH(B->left),A->H) + 1;
    return B;
}
AVLTree RR(AVLTree A){
    AVLTree B=A->right;
    A->right=B->left;
    B->left=A;
    A->H=max(GetH(A->left),GetH(A->right))+1;
    B->H=max(GetH(B->right),A->H)+1;
    return B; 
}
AVLTree LR(AVLTree A){
    AVLTree B=A->left;
    AVLTree C=B->right;
    B->right=C->left;
    C->left=B;
    A->left=C->right;
    C->right=A;
    A->H=max(GetH(A->left),GetH(A->right))+1;
    B->H=max(GetH(B->left),GetH(B->right))+1;
    C->H=max(A->H,B->H)+1;
    return C;
}
AVLTree RL(AVLTree A){
    AVLTree B=A->right;
    AVLTree C=B->left;
    B->left=C->right;
    C->right=B;
    A->right=C->left;
    C->left=A;
    A->H=max(GetH(A->left),GetH(A->right))+1;
    B->H=max(GetH(B->left),GetH(B->right))+1;
    C->H=max(A->H,B->H)+1;
    return C; 
}

AVLTree Insert(AVLTree T,int k){
    if(!T){
        T=(AVLTree)malloc(sizeof(struct AVLNode));
        T->data=k;
        T->H=0;
        T->left=T->right=NULL;
    }else if(k<T->data){
        T->left=Insert(T->left,k);
       if(GetH(T->left)-GetH(T->right)==2){
           if(k<T->left->data){
               T=LL(T);
           }else{
               T=LR(T);
           }
       }
    }else if(k>T->data){
        T->right=Insert(T->right,k);
        if(GetH(T->right)-GetH(T->left)==2){
            if(k>T->right->data){
                T=RR(T);
            }else{
                T=RL(T);
            }
        }
    }
    T->H=max(GetH(T->left),GetH(T->right))+1;
    return T;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值