就是基础的avl操作
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
typedef struct node {
int val;
int height;
struct node *left;
struct node *right;
}Node,*TreeNode;
TreeNode newnode(int val){
TreeNode node = new Node;
node->val = val;
node->height = 1;
node->left = node->right = NULL;
return node;
}
int getHeight(TreeNode root){
if(!root) return 0;
return root->height;
}
int getBalance(TreeNode root){
return getHeight(root->left) - getHeight(root->right);
}
void updateHeight(TreeNode root){
root->height = max(getHeight(root->left),getHeight(root->right))+1;
}
void L(TreeNode &root){
TreeNode temp = root->right;
root->right = temp->left;
temp->left = root;
updateHeight(root);
updateHeight(temp);
root = temp;
}
void R(TreeNode &root){
TreeNode temp = root->left;
root->left = temp->right;
temp->right = root;
updateHeight(root);
updateHeight(temp);
root = temp;
}
void insert(TreeNode &root,int val){
if (root == NULL) {
root = newnode(val);
// root->val = val;
// root->left = root->right = NULL;
return;
}
if (val < root->val) {
insert(root->left, val);
updateHeight(root);
if (getBalance(root) == 2) {
if (getBalance(root->left) == 1) {
R(root);
}else if(getBalance(root->left) == -1){
L(root->left);
R(root);
}
}
}else{
insert(root->right, val);
updateHeight(root);
if (getBalance(root) == -2) {
if (getBalance(root->right) == -1) {
L(root);
}else if(getBalance(root->right) == 1){
R(root->right);
L(root);
}
}
}
}
TreeNode create(vector<int> v){
TreeNode root = NULL;
for (int i=0; i<v.size(); i++) {
insert(root, v[i]);
}
return root;
}
int main(){
int n;
scanf("%d",&n);
vector<int> v;
for (int i=0; i<n; i++) {
int a;
scanf("%d",&a);
v.push_back(a);
}
TreeNode root = create(v);
printf("%d\n",root->val);
}