1066. Root of AVL Tree (25)
时间限制 100 ms
内存限制 65536 kB
代码长度限制 16000 B
判题程序
Standard 作者 CHEN, Yue
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.
Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print ythe root of the resulting AVL tree in one line.
Sample Input 1:
5 88 70 61 96 120
Sample Output 1:
70
Sample Input 2:
7 88 70 61 96 120 90 65
Sample Output 2:
88
tips:1.不要使用0下标
2.k代表旋转类型,1右旋,0左旋
#include<iostream>
#include<queue>
using namespace std;
int n,rt,sz;
int a[55],h[55],t[55][2],f[55];
int getnode(int val,int fr)
{
sz++;a[sz]=val;h[sz]=1;f[sz]=fr;return sz;
}
void count(int x)
{
h[x]= max(h[t[x][0]],h[t[x][1]])+1;
}
void rotate(int x,int k)
{
int fr=f[x];int g=f[fr];
t[fr][!k]=t[x][k];if(t[x][k])f[t[x][k]]=fr;
if(g)t[g][fr==t[g][1]]=x;f[x]=g;
t[x][k]=fr;f[fr]=x;
count(fr);count(x);
}
int change(int x)
{
for(int g=f[f[x]];g;g=f[f[x]])
{
count(f[x]);count(g);
if(abs(h[t[g][0]]-h[t[g][1]])>1)
{
int y= x==t[f[x]][0];
int z=f[x]==t[g][0];
y^z?(rotate(x,y),rotate(x,z)):rotate(f[x],z);
}
else x=f[x];
}
while(f[x]){count(x);x=f[x];}
return x;
}
void insert(int &x,int y)
{
if(!x){x=getnode(y,x);return;}
for(int i=x;;i=t[i][y>a[i]])
{
if(t[i][y>a[i]])continue;
t[i][y>a[i]]=getnode(y,i);
x=change(t[i][y>a[i]]);return ;
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
int x;cin>>x;
insert(rt,x);
}
cout<<a[rt]<<endl;
return 0;
}