平衡二叉树

#include<iostream>
using namespace std;
typedef struct avltree
{
    int key;
    int height;
    struct avltree *left,*right;
}Node,*avlTree;
int height(avlTree p){
    return p==NULL?-1:p->height;
}
int max_num(int a,int b){
    return a>b?a:b;
}
void postorder_avlTree(avlTree tree){
    if(tree){
        postorder_avlTree(tree->left);
        postorder_avlTree(tree->right);
        cout<<tree->key<<" ";
    }
    //cout<<endl;
}
//ll型,右旋
Node* LL_Rotation(avlTree k2){
    avlTree k1;
    k1 = k2->left;
    k2->left = k1->right;
    k1->right = k2;
    k1->height = max_num(height(k1->left),height(k1->right))+1;
    k2->height = max_num(height(k2->left),height(k2->right))+1;
    return k1;
}
//RR型,左旋
Node* RR_Rotation(avlTree k1){
    avlTree k2;
    k2 = k1->right;
    k1->right = k2->left;
    k2->left = k1;
    k1->height = max_num(height(k1->left),height(k1->right))+1;
    k2->height = max_num(height(k2->left),height(k2->right))+1;
    return k2;
}
//LR型,先右旋后左旋
Node* LR_Rotation(avlTree k1){
    k1->left = RR_Rotation(k1->left);
    return LL_Rotation(k1);
}
//RL型,先左旋后右旋
Node* RL_Rotation(avlTree k1){
    k1->right = LL_Rotation(k1->right);
    return RR_Rotation(k1);
}
//创建avl树
Node* avltreeCreateNode(Node* left,Node* right,int key){
    Node* p;
    p = new Node;
    p->key = key;
    p->left = left;
    p->right = right;
    return p;
}
/*
将节点插入到acl树中,并返回根节点,
*/
Node* avltree_insert(Node* tree,int key){
    if(tree == NULL){
        tree = avltreeCreateNode(NULL,NULL,key);
        if(tree == NULL)//创建失败
            return NULL;
    }
    else if(key < tree->key){
        //插入到左子树
        tree->left = avltree_insert(tree->left,key);
        if(height(tree->left)-height(tree->right) == 2){
            //插入节点失去平衡
            if(key<tree->left->key)
                tree = LL_Rotation(tree);
            else
                tree = LR_Rotation(tree);
        } 
    }
    else if(key>tree->key){
        //插入到右子树
        tree->right = avltree_insert(tree->right,key);
         if(height(tree->right)-height(tree->left) == 2){
             if(key>tree->right->key)
                tree = RR_Rotation(tree);
            else
                tree = RL_Rotation(tree);
         }
    }

    else   
        cout<<"插入失败。。。";
    
    tree->height = max_num(height(tree->left),height(tree->right))+1;
    return tree;
}
int main(){
    int arr[16]={3,2,1,4,5,6,7,16,15,14,13,12,11,10,8,9};
    avlTree root = NULL;
    for(int i=0;i<16;i++)
        root = avltree_insert(root,arr[i]);
    //后序遍历
    postorder_avlTree(root);
    system("pause");
    return 0;
}

posted @ 2020-10-26 23:29  TiSou1  阅读(153)  评论(0)    收藏  举报