04-树5 Root of AVL Tree(25 point(s))

题目位置
分析:
直接硬上:1、构造 判断树(解决插入问题)。
2、构造 后续遍历(解决 每一个指针的 平衡因子数的计算)。
3、通过判断树的平衡因子正负,进而可知 是ll,rr,lr,rl的哪一种。
4、 构造这4种选择方式。
5、在解决后进行 最后一次的 后序遍历 在计算平衡因子。
【注】在插入的时候其实 是一个 和 后续遍历类似的 递归函数,进而 通过这一特性,可以实时掌控哪一个地方 平衡因子 先被破坏,尽而进行rotation,再返回指针。解决了 root改变后的丢失问题。
关于ll,rr,lr,rl : 最简单实现lr 和rl 方法 就是借用ll循环 和rr循环 来做。

#include <stdio.h>
#include <stdlib.h>
typedef struct BinTree *Tree;
struct BinTree{
    int data;
    Tree left;
    Tree right;
    int balance;
};
Tree InsertJudgeTree(Tree T,int data);
void postTraverse(Tree T);
int BalanceCalculator(Tree T);
Tree rl(Tree T);
Tree ll(Tree T);
Tree rr(Tree T);
Tree lr(Tree T);
int main(){
    int i,j;
    int N;
    int data;
    Tree T=NULL;
    scanf("%d",&N);
    for(i=0;i<N;i++){
    scanf("%d",&data);
    T = InsertJudgeTree(T,data);
    BalanceCalculator(T);
    //postTraverse(T);
    //printf("\n");
    }
    printf("%d",T->data);
//    printf("%d",T->data);
//    printf("\n");
//    postTraverse(T);
//    int a = BalanceCalculator(T);
//    printf("\n");
//    printf("\n%d",a);
}
Tree ll(Tree T){
    Tree B = T->left;
    T->left = B->right;
    B->right =T;
    return B;
}
Tree rr(Tree T){
    Tree B = T->right;
    T->right = B->left;
    B->left =T;
    return B;
}
Tree lr(Tree T){
    T->left = rr(T->left);
    return ll(T);
}
Tree rl(Tree T){
    T->right = ll(T->right);
    return rr(T);
}
void postTraverse(Tree T){
    if(!T) return ;
    else {
        postTraverse(T->left);
        postTraverse(T->right);
        printf("%d ",T->data);
    }
}
int BalanceCalculator(Tree T){
    if(!T) return 0;
    else {

       int  ltHeight=BalanceCalculator(T->left);

       int  rtHeight=BalanceCalculator(T->right);

       T->balance = ltHeight-rtHeight;

       return ltHeight<rtHeight?rtHeight+1:ltHeight+1;
    }
}
Tree InsertJudgeTree(Tree T,int data){
    if(!T){
        T=(Tree)malloc(sizeof(struct BinTree));
        T->data =data;
        T->left = NULL;
        T->right = NULL;
        T->balance = 0;
        return T;
    }
    else{if(T->data<data){
            T->right = InsertJudgeTree(T->right,data);
            BalanceCalculator(T);
            if(abs(T->balance)==2){
            if(T->right->balance<0)T=rr(T);
            else T=rl(T);
            }
        }
         else if (T->data>data){
            T->left = InsertJudgeTree(T->left,data);
            BalanceCalculator(T);
            if(abs(T->balance)==2){
            if(T->left->balance>0)T=ll(T);
            else T=lr(T);
            }
        }
    }
    BalanceCalculator(T);
    return T;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值