#include <iostream>
#define MAX 2;
using namespace std;
struct treenode{
int key;
int high;
treenode* left;
treenode* right;
};
class autoTree{
public:
int maxH(int a,int b);
treenode* Lrotate(treenode* node);//向左转 ,即转到左下角 RR
treenode* Rrotate(treenode* node);//向右转 LL
treenode* RL(treenode* node);//RL
treenode* LR(treenode* node);//LR
treenode* insertnode(treenode* node,int key);
int printH(treenode* root);//输出高度
};
int autoTree::maxH(int a,int b){
if(a>b)return a;
else return b;
}
treenode* autoTree::Lrotate(treenode* node){//RR
treenode* temp=node->right;
node->right=temp->left;
temp->left=node;
node->high=max(node->left->high,node->right->high)+1;
temp->high=max(temp->left->high,temp->right->high)+1;
return temp;
}
treenode* autoTree::Rrotate(treenode* node){//LL
treenode* temp=node->left;
node->left=temp->right;
temp->right=node;
node->high=max(node->left->high,node->right->high)+1;
temp->high=max(temp->left->high,temp->right->high)+1;
return temp;
}
treenode* autoTree::RL(treenode* node){
node->right=Rrotate(node->right);
return Lrotate(node);
}
treenode* autoTree::LR(treenode* node){
node->left=Lrotate(node->left);
return Rrotate(node);
}
treenode* autoTree::insertnode(treenode* node,int key){
if(!node){
//node=initTree(key);
node=new treenode();
node->high=0;
node->key=key;
node->left=node->right=NULL;
// cout<<"succeed1"<<endl;
}
else if(key>node->key){
node->right=insertnode(node->right,key);
if(node->right->high-node->left->high>1){
if(key>node->right->key)node=Lrotate(node);
else{
node=RL(node);
//node->right=Rrotate(node->right);
}
}
}
else if(key<node->key){
node->left=insertnode(node->left,key);
if(node->left->high-node->right->high>1){
if(key<node->left->key)node=Rrotate(node);
else node=LR(node);
}
}
node->high=maxH(node->left->high,node->right->high)+1;
return node;
}
int autoTree::printH(treenode* root){
cout<<root->high;
}