PAT A1066 Root of AVL Tree ——春水碧于天,画船听雨眠

PAT A1066 Root of AVL Tree

  • AVL这东西记一次忘一次,每次看就像披着初恋外衣的旧情人(or reverse)
  • 以下应该是较为标准的模板方法,只是好久没有用过指针了,所以写了个静态的版本,有些地方有点别扭
  • 在这里插入图片描述
#include<iostream>
#include<vector>

using namespace std;

struct Node{
    int data,left,right,height;
    Node(){
        left = -1;
        right = -1;
        height = 0;
    }
};
vector<Node> vn;

void updateHeight(int root){
    int hl = vn[root].left != -1 ? vn[vn[root].left].height : -1;
    int hr = vn[root].right != -1 ? vn[vn[root].right].height : -1;
    vn[root].height = max(hl,hr) + 1;
}

int rotateL(int root){
    int tmp = vn[root].right;
    vn[root].right = vn[tmp].left;
    vn[tmp].left = root;
    updateHeight(root);
    updateHeight(tmp);
    return tmp;
}

int rotateR(int root){
    int tmp = vn[root].left;
    vn[root].left = vn[tmp].right;
    vn[tmp].right = root;
    updateHeight(root);
    updateHeight(tmp);
    return tmp;
}

int getBalanceFactor(int root){
    int hl = vn[root].left != -1 ? vn[vn[root].left].height : -1;
    int hr = vn[root].right != -1 ? vn[vn[root].right].height : -1;
    return hl - hr;
}

int insert(int root,int idx){
    if(root == -1) return idx;
    if(vn[idx].data < vn[root].data){
        vn[root].left = insert(vn[root].left,idx);
        updateHeight(root);
        if(getBalanceFactor(root) == 2){
            if(getBalanceFactor(vn[root].left) == 1) root = rotateR(root);
            else if(getBalanceFactor(vn[root].left) == -1){
                vn[root].left = rotateL(vn[root].left);
                root = rotateR(root);
            }
        }
    }else{
        vn[root].right = insert(vn[root].right,idx);
        updateHeight(root);
        if(getBalanceFactor(root) == -2){
            if(getBalanceFactor(vn[root].right) == -1) root = rotateL(root);
            else if(getBalanceFactor(vn[root].right) == 1){
                vn[root].right = rotateR(vn[root].right);
                root = rotateL(root);
            }
        }
    }
    return root;
}

int main(){

    int N,root = -1;
    cin >> N;
    vn.resize(N);
    for(int i = 0;i < N;i ++){
        cin >> vn[i].data;
        root = insert(root,i);
    }
    cout << vn[root].data;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值