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