原文链接:我的个人博客
原题链接
考点
AVL树
思路
主要考查的就是平衡二叉树。可以先看这篇文章。
代码
#include <iostream>
#include <cmath>
using namespace std;
struct node{
int key;
node *left,*right;
};
//左旋
node* leftRotate(node *tree){
node* tmp = tree->right;//保存右子树,新的根
tree->right = tmp->left;//更新原来根节点的右子树
tmp->left = tree;//将原来的根节点作为新的根节点的左孩子
return tmp; //返回新的根节点
}
//右旋
node* rightRotate(node *tree){
node* tmp= tree->left;//保存根的左子树,即为新的根
tree->left = tmp->right;//跟新原来根的左子树
tmp->right = tree;//更新 新的根的右子树
return tmp; //返回新的根节点
}
node* LR(node *tree){
tree->left = leftRotate(tree->left);//先对根的左子树左旋
return rightRotate(tree);//再右旋根节点
}
node* RL(node *tree){
tree->right = rightRotate(tree->right);
return leftRotate(tree);
}
//获取高度
int getHeight(node *tree){
if(tree==NULL) return 0;
int l = getHeight(tree->left);
int r = getHeight(tree->right);
return max(l,r) +1;
}
node* build(node *root,int val){//向根节点root插入val
if(root==NULL){
root = new node();
root->key = val;
}else if(val <root->key){//在左子树上char
root->left = build(root->left,val);
int l = getHeight(root->left);
int r = getHeight(root->right);
if(abs(l-r)>=2){
if(val < root->left->key){//在左子树的左子树上插入导致不平衡
root=rightRotate(root);
}else{//在左子树的右子树上插入导致不平衡
root=LR(root);
}
}
}else{//在右子树上
root->right = build(root->right,val);
int l = getHeight(root->left);
int r = getHeight(root->right);
if(abs(l-r)>=2){
if(val < root->right->key){//在右子树的左子树上插入导致不平衡
root=RL(root);
}else{//在右子树的右子树上插入导致不平衡
root=leftRotate(root);
}
}
}
return root;
}
int main(){
int n,tmp;
cin>>n;
node *root=NULL;
for(int i=0;i<n;i++){
cin>>tmp;
root = build(root,tmp);//建树
}
cout<<root->key;
return 0;
}