#include <iostream>
#include <algorithm>
using namespace std;
int n;
const int N=30;
int l[N],r[N],v[N],h[N],idx=0;//l[编号]=左儿子编号,v[编号]=权值,h[编号]=高度
int get_balance(int u){
return h[l[u]]-h[r[u]];
}
void update(int u){
h[u]=max(h[l[u]],h[r[u]])+1;
}
void R(int &u){//右旋,引用符号改变u(根)
int p=l[u];
l[u]=r[p],r[p]=u;
update(u),update(p);
u=p;
}
void L(int &u){//左旋,引用符号改变u(根)
int p=r[u];
r[u]=l[p],l[p]=u;
update(u),update(p);
u=p;
}
void insert(int &u,int w){
// cout<<"右,根="<<v[u]<<"右儿子="<<v[r[u]]<<endl;
// cout<<u<<endl;
if(!u) u=++idx,v[u]=w;
else if(w<v[u]){
insert(l[u],w);
if(get_balance(u)==2){//左儿子多
if(get_balance(l[u])==1) R(u);
else L(l[u]),R(u);
}
}else{
insert(r[u],w);
// cout<<"右,根="<<v[u]<<"右儿子="<<v[r[u]]<<endl;
if(get_balance(u)==-2){//右儿子多
if(get_balance(r[u])==-1) L(u);
else R(r[u]),L(u);
}
}
update(u);
}
int main(){
cin>>n;
int root=0;
for(int i=0;i<n;i++){
int w;cin>>w;
insert(root,w);
}
cout<<v[root]<<endl;
return 0;
}
1066 Root of AVL Tree 分数 25
于 2022-04-25 21:10:34 首次发布