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

#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
int v,height;
node* lchild,*rchild;
}*root; node* newNode(int v){
node* Node = new node;
Node->v = v;
Node->height = ;
Node->lchild = Node->rchild = NULL;
return Node;
} int getHeight(node* root){
if(root == NULL) return ;
return root->height;
} void updateHeight(node* root){
root->height = max(getHeight(root->lchild),getHeight(root->rchild)) + ;
} int getBalanceFactor(node* root){
return getHeight(root->lchild) - getHeight(root->rchild);
} void R(node* &root){
node* temp = root->lchild;
root->lchild = temp->rchild;
temp->rchild = root;
updateHeight(root);
updateHeight(temp);
root = temp;
} void L(node* &root){
node* temp = root->rchild;
root->rchild = temp->lchild;
temp->lchild = root;
updateHeight(root);
updateHeight(temp);
root = temp;
} void insert(node* &root,int v){
if(root == NULL){
root = newNode(v);
return;
}
if(root->v > v){
insert(root->lchild,v);
updateHeight(root);
if(getBalanceFactor(root) == ){
if(getBalanceFactor(root->lchild) == ){
R(root);
}else if(getBalanceFactor(root->lchild) == -){
L(root->lchild);
R(root);
}
}
}else{
insert(root->rchild,v);
updateHeight(root);
if(getBalanceFactor(root) == -){
if(getBalanceFactor(root->rchild) == -){
L(root);
}else if(getBalanceFactor(root->rchild) == ){
R(root->rchild);
L(root);
}
}
}
} int main(){
int n,v;
scanf("%d",&n);
for(int i = ; i < n; i++){
scanf("%d",&v);
insert(root,v);
}
printf("%d",root->v);
return ;
}

最新文章

  1. [CC]LOD技术
  2. Qt之C语言类型typedef a[]等
  3. .net Session 详解
  4. mesos资源动态分配测试
  5. 【题解】【直方图】【Leetcode】Trapping Rain Water
  6. PHPExcel读取excel的多个sheet存入数据库
  7. 【CF】222 Div.1 B Preparing for the Contest
  8. C# gridview分頁導出excel
  9. Unity5权威讲解
  10. UIApearance
  11. C语言学习第三章
  12. (转)C语言malloc()与free()的使用
  13. 数组的遍历你都会用了,那Promise版本的呢
  14. Java采用JDBC的方式连接Hive(SparkSQL)
  15. 移动端自动化测试-Windows-Android-Appium环境搭建
  16. jquery中ajax的写法
  17. taro 开发注意点
  18. CentOS下配置MySQL允许root用户远程登录
  19. trace
  20. centos7安装 docker

热门文章

  1. Python代码注释
  2. Hyperledger Fabric源码解析
  3. 数字图像处理实验(16):PROJECT 06-03,Color Image Enhancement by Histogram Processing 标签: 图像处理MATLAB 2017
  4. Python基础-3
  5. 三年经验的C,超过两题答不出请离开软件界
  6. (转)QueryBuilder : 打造优雅的Linq To SQL动态查询
  7. C语言中无符号与有符号问题
  8. 第十篇 requests模块
  9. day4学python 字符编码转换+元组概念
  10. 在虚拟机中连接oracle数据库报错ORA-12154,其他服务器连接无问题