**
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.
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 the 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
题解:就是一个很简单很裸的平衡二叉树模板题,很多人用链表实现,我追求简洁用的数组,代码如下。
AC代码
#include<bits/stdc++.h>
using namespace std;
int tree[30][2],val[30];
int rotation_left(int u)
{
int v=tree[u][1];
tree[u][1]=tree[v][0];
tree[v][0]=u;
return v;
}
int rotation_right(int u)
{
int v=tree[u][0];
tree[u][0]=tree[v][1];
tree[v][1]=u;
return v;
}
int rotation_LR(int u)
{
tree[u][0]=rotation_left(tree[u][0]);
return rotation_right(u);
}
int rotation_RL(int u)
{
tree[u][1]=rotation_right(tree[u][1]);
return rotation_left(u);
}
int get_height(int u)
{
if(u==-1)return 0;
return max(get_height(tree[u][0]),get_height(tree[u][1]))+1;
}
int insert(int u,int x)
{
if(u==-1)
{
return x;
}
if(val[x]<val[u])
{
tree[u][0]=insert(tree[u][0],x);
if((get_height(tree[u][0])-get_height(tree[u][1]))==2)
{
if(val[x]<val[tree[u][0]])//LL
return rotation_right(u);
else return rotation_LR(u);
}
}
else
{
tree[u][1]=insert(tree[u][1],x);
if((get_height(tree[u][1])-get_height(tree[u][0]))==2)
{
if(val[x]>val[tree[u][1]])//RR
return rotation_left(u);
else return rotation_RL(u);
}
}
return u;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>val[i];
}
int root=-1;
memset(tree,-1,sizeof(tree));
for(int i=1;i<=n;i++)
{
root=insert(root,i);
}
cout<<val[root]<<endl;
return 0;
}