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
题目大意:求avl树根的值
推荐一个AVL学习博客:https://www.cnblogs.com/WindSun/p/11379670.html
代码:
//AVL:平衡二叉搜索树
//AVL的代码模板
#include <bits/stdc++.h>
using namespace std;
struct Node{
int val;
struct Node *left, *right;
};
//左旋
/*
.
.
.
*/
Node *leftRotate(Node *rt){
Node *temp = rt->right;
rt->right = temp->left;
temp->left = rt;
return temp;
}
//右旋
/*
.
.
.
*/
Node *rightRotate(Node *rt){
Node *temp = rt->left;
rt->left = temp->right;
temp->right = rt;
return temp;
}
//先左再右旋
/*
. .
. <- 左旋 --> .
. .
*/
Node *leftRightRotate(Node *rt){
rt->left = leftRotate(rt->left);
return rightRotate(rt);
}
//先右再左旋
/*
. .
. <- 右旋 --> .
. .
*/
Node *rightLeftRotate(Node *rt){
rt->right = rightRotate(rt->right);
return leftRotate(rt);
}
//高度
int getHg(Node *rt){
if( rt == NULL) return 0;
return max(getHg(rt->left), getHg(rt->right)) + 1;
}
//插入 构造AVL
Node *insert(Node *rt, int val){
if(rt == NULL){
rt = new Node();
rt->val = val;
rt->right = rt->left = NULL;
}else if(val < rt->val ){
rt->left = insert(rt->left, val);
if(getHg(rt->left) - getHg(rt->right) == 2){
rt = val < rt->left->val ? rightRotate(rt) : leftRightRotate(rt);
}
}else {
rt->right = insert(rt->right, val);
if(getHg(rt->left) - getHg(rt->right) == -2){
rt = val > rt->right->val ? leftRotate(rt) : rightLeftRotate(rt);
}
}
return rt;
}
int main(){
int n, v;
cin >> n;
Node *rt = NULL;
for(int i = 0; i < n; i++){
cin >> v;
rt = insert(rt, v);
}
cout << rt->val << endl;
return 0;
}