
平衡树
avl的板子,跟treap不同的是需要自己判断高度差(四种情况)来实现平衡
#include<bits/stdc++.h>
using namespace std;
const int N = 30;
int idx;
struct NODE{
int l,r;
int key;
int h;
}node[N];
int newnode(int key){
node[++idx].key=key;
return idx;
}
void update(int p){
node[p].h=max(node[node[p].l].h,node[node[p].r].h)+1;
}
void zig(int &p){
int q=node[p].l;
node[p].l=node[q].r;
node[q].r=p;
p=q;
update(node[p].r),update(p);
}
void zag(int &p){
int q=node[p].r;
node[p].r=node[q].l;
node[q].l=p;
p=q;
update(node[p].l),update(p);
}
int get_balance(int p){
return node[node[p].l].h-node[node[p].r].h;
}
void insert(int &p,int key){
if(!p) p=newnode(key);
else{
if(node[p].key>key) insert(node[p].l,key);
else insert(node[p].r,key);
if(get_balance(p)==2){
if(get_balance(node[p].l)==1) zig(p);
else zag(node[p].l),zig(p);
}
else if(get_balance(p)==-2){
if(get_balance(node[p].r)==-1) zag(p);
else zig(node[p].r),zag(p);
}
}
update(p);
}
int main(){
int n,root=0;
cin>>n;
for(int i=1;i<=n;i++){
int x;
cin>>x;
insert(root,x);
}
cout<<node[root].key;
return 0;
}