AVL平衡二叉树模板

平衡二叉树是二叉查找树。

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;
}

 

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/m0_37701448/article/details/82432022
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞