1066. Root of AVL Tree (25)
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.
![](https://www.patest.cn/upload/79_mtxjq1kj3gx.jpg)
![](https://www.patest.cn/upload/79_mtxjqnwja2o.jpg)
![](https://www.patest.cn/upload/79_mtxjr4gyzdg.jpg)
![](https://www.patest.cn/upload/79_mtxjrh51o9y.jpg)
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 120Sample Output 1:
70Sample Input 2:
7 88 70 61 96 120 90 65Sample 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; }