平衡二叉樹(AVL)

12-num發表於2018-12-13

AVL就是優化二叉查詢樹

平衡因子不大於1

左 < 根 < 右

 

具體看程式碼

#include<bits/stdc++.h>

using namespace std;
typedef struct node;
typedef node * tree;
struct node
{
    int v;
    int heigh;
    tree L,R;
};

//獲取以root為根結點的子樹的當前height
int getheigh(tree root)
{
    if(root==NULL) return 0;
    return root->heigh;
}

//更新結點root的heigh
void updataheigh(tree root)
{
    //max(左孩子結點的height,有孩子結點的height)+1
    root->heigh=max(getheigh(root->L),getheigh(root->R))+1;
}


//計算平衡因子
int getBalance(tree root)
{
    //左-右
    return getheigh(root->L)-getheigh(root->R);
}


//左旋  注意原理 對於RR是root的右孩子的平衡因子是-1
void L(tree &root)
{
    tree temp;
    temp=root->R;
    root->R=temp->L;
    temp->L=root;
    updataheigh(root);
    updataheigh(temp);
    root=temp;
}

void R(tree &root)
{
    tree temp;
    temp=root->L;
    root->L=temp->R;
    temp->R=root;
    updataheigh(root);
    updataheigh(temp);
    root=temp;
}
void insertt(tree &root,int v)
{
    if(root==NULL){//當結點是空的時候 就是插入的時候
        root=new node;
        root->v=v;
        root->heigh=1;
        root->L=root->R=NULL;
        return;
    }
    if(v<root->v){
        insertt(root->L,v);
        updataheigh(root);//注意更新樹高
        if(getBalance(root)==2){
            if(getBalance(root->L)==1){
                R(root);
            }
            else if(getBalance(root->L)==-1){
                L(root->L);
                R(root);
            }
        }
    }
    else{
        insertt(root->R,v);
        updataheigh(root);
        if(getBalance(root)==-2){
            if(getBalance(root->R)==-1){
                L(root);
            }
            else if(getBalance(root->R)==1){
                R(root->R);
                L(root);
            }
        }
    }

}
int main()
{
    int n;
    scanf("%d",&n);
    int x;
    tree root;
    root=NULL;
    for(int i=0;i<n;i++){
        scanf("%d",&x);
        insertt(root,x);
    }
    printf("%d
",root->v);
    return 0;
}

 

相關文章