AVL树

AVL树是一种自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1。因此,插入、查找和删除在平均和最坏情况下的时间复杂度都是O(logn)。

这四个图分别对应AVL树的右旋,左旋,先右再左旋,先左再右旋。 
struct node{
    int key,height;
    node *left,*right;
};

node a[21];
int t=0;

int height(node* n){
    if(n==NULL)
       return 0;
    return n->height;
}

node* LL(node* n1){
    node* n2=n1->right;
    n1->right=n2->left;
    n2->left=n1;
    n1->height=max(height(n1->left),height(n1->right))+1;
    n2->height=max(height(n2->left),height(n2->right))+1;
    return n2;
}

node* RR(node* n1){
    node* n2=n1->left;
    n1->left=n2->right;
    n2->right=n1;
    n1->height=max(height(n1->left),height(n1->right))+1;
    n2->height=max(height(n2->left),height(n2->right))+1;
    return n2;
}

node* LR(node* n){
    n->left=LL(n->left);
    return RR(n);
}

node* RL(node* n){
    n->right=RR(n->right);
    return LL(n);
}

node* insert(node* n,int k){
    if(n==NULL){
        n=&a[t++];
        n->left=n->right=NULL;
        n->height=0;
        n->key=k;
    }
    else if(k<n->key){
        n->left=insert(n->left,k);
        if(height(n->left)-height(n->right)==2){
            if(k<n->left->key)
                n=RR(n);
            else
                n=LR(n);
        }
    }
    else{
        n->right=insert(n->right,k);
        if(height(n->right)-height(n->left)==2){
            if(k<n->right->key)
                n=RL(n);
            else
                n=LL(n);
        }
    }
    n->height=max(height(n->left),height(n->right))+1;
    return n;
}

 

posted @ 2019-07-25 10:47  Hanasaki  阅读(201)  评论(0编辑  收藏  举报