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;
}