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