平衡二叉树是二叉查找树。
AVL树的特点:任意结点的左子树与右子树的高度之差绝对值不超过1。
计算:某结点的平衡因子=左子树的高度-右子树的高度
保证每个结点的平衡因子绝对值不超过1,则AVL树高度始终保持在O(logn)级别,查找一次结点的时间复杂度保持在O(logn)级别。
下面是建立AVL树的模板:
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int maxn=21;
struct node{
int height,data; //data为结点权值,height为当前子树高度
struct node* left,*right; //左右孩子的结点地址
};
//获取以root为根节点的子树的当前height
int getHeight(node * root){
if(root==NULL) return 0; //空结点高度为0
return root->height;
}
//计算结点root的平衡因子
int getBalanceFactor(node *root){
//左子树高度减去右子树高度
return getHeight(root->left)-getHeight(root->right);
}
//更新结点root的高度
void updateHeight(node *root){
if(root==NULL) root->height=0;
else{
root->height=max(getHeight(root->left),getHeight(root->right))+1;
}
}
node * newNode(int v){
node *Node=new node;
Node->data=v;
Node->height=1;
Node->left=Node->right=NULL;
return Node;
}
//左旋操作
void L(node* &root){
node * temp=root->right;
root->right=temp->left;
temp->left=root;
updateHeight(root); //记得更新结点的高度
updateHeight(temp);
root=temp;
}
//右旋操作
void R(node* &root){
node * temp=root->left;
root->left=temp->right;
temp->right=root;
updateHeight(root);
updateHeight(temp);
root=temp;
}
//插入权值为v的结点
void insert(node* &root,int v){
if(root==NULL) { //到达空结点
root=newNode(v);
return;
}
if(root->data>v){ //v比根节点的权值小
insert(root->left,v); //往左子树插入
updateHeight(root); //更新树高
if(getBalanceFactor(root)==2){
if(getBalanceFactor(root->left)==1){ //LL型
R(root);
}
else if(getBalanceFactor(root->left)==-1){ //LR型
L(root->left);
R(root);
}
}
}
else{
insert(root->right,v); //往右子树插入
updateHeight(root); //更新树高
if(getBalanceFactor(root)==-2){
if(getBalanceFactor(root->right)==-1){ //RR型(!注意 此时平衡因子为-1)
L(root);
}
else if(getBalanceFactor(root->right)==1){ //RL型
R(root->right);
L(root);
}
}
}
}
void preorder(node *n){
if(n==NULL) return;
printf("%d\n",n->data);
preorder(n->left);
preorder(n->right);
}
int main(){
int n;
node *root=NULL;
scanf("%d",&n);
for(int i=0;i<n;i++){
int t;
scanf("%d",&t);
insert(root,t);
//preorder(root);
//printf("\n");
}
printf("%d",root->data);
return 0;
}