1066 Root of AVL Tree(51行代码+超详细注释)

文章介绍了AVL树的概念,这是一种自平衡二叉搜索树,确保任何节点的两个子树高度差不超过1。当插入新节点导致不平衡时,通过旋转规则(右旋、左旋)进行调整。给定一系列插入操作,程序需计算并输出最终AVL树的根节点值。
摘要由CSDN通过智能技术生成

分数 25

全屏浏览题目

切换布局

作者 CHEN, Yue

单位 浙江大学

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

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include<bits/stdc++.h>
using namespace std;
const int N=25;
int n;
int l[N],r[N],h[N],v[N],idx,root;//分别为左子树,右子树,高度,结点权值,当前结点,根结点 
void updata(int u){//更新结点u的高度 
    h[u]=max(h[l[u]],h[r[u]])+1;
}
int R(int &root){//右旋 
    int t=l[root];
    l[root]=r[t],r[t]=root;;
    updata(root),updata(t);
    root=t;
}
int L(int &root){//左旋 
    int t=r[root];
    r[root]=l[t],l[t]=root;
    updata(root),updata(t);
    root=t;
}
int balance_alpha(int u){//左右子树的高度差 
    return h[l[u]]-h[r[u]];
}
void insert(int &u,int x){//插入 
    if(!u)u=++idx,v[u]=x;//如果结点为空,则将x的插入该节点 
    else if(x<v[u]){//如果插入结点的值小于当前结点 
        insert(l[u],x);//往左子树插入 
        if(balance_alpha(u)==2){//插完后若u结点的平衡因子为2 
            if(balance_alpha(l[u])==1)R(u);//若此时左子树的平衡因子为1则右旋u结点 
            else L(l[u]),R(u);//否则则先左旋左孩子后右旋u结点    
        }
    }
    else if(x>=v[u]){//参照上面 
        insert(r[u],x);
        if(balance_alpha(u)==-2){
            if(balance_alpha(r[u])==-1)L(u);
            else R(r[u]),L(u);
        }
    }
    updata(u);//插完之后更新u结点高度 
}
int main(){
    cin>>n;
    while(n--){//输入 
        int x;
        cin>>x;
        insert(root,x);//插入x 
    }
    cout<<v[root]<<endl;//输出根结点的值 
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值