#include
#include
#include<stdlib.h>
#include<time.h>
#include
#include
using namespace std;
typedef struct node* tree;
struct node
{
long int data;
node* left;
node* right;
};
int GetHeight(tree root)
{
int Hr, Hl, m;
if (!root)
{
return 0;
}
Hl = GetHeight(root->left);
Hr = GetHeight(root->right);
return ( (Hr > Hl) ? Hr : Hl)+1;
}
tree LeftLeft(tree root)
{
tree b = root->left;
root->left = b->right;
b->right = root;
return b;
}
tree RightRight(tree root)
{
tree b = root->right;
root->right = b->left;
b->left = root;
return b;
}
tree LeftRight(tree root)
{
root->left = RightRight(root->left);
return LeftLeft(root);
}
tree RightLeft(tree root)
{
root->right = LeftLeft(root->right);
return RightRight(root);
}
typedef int Element;
tree buildtree(tree root, Element x)
{
if (!root)
{
root = new node;
root->data = x;
root->left = root->right = NULL;
}
if (x < root->data)
{
root->left = buildtree(root->left, x);
if (abs(GetHeight(root->left) - GetHeight(root->right)) == 2)
{
if (x < root->left->data)
{
root=LeftLeft(root);
}
else
{
root=LeftRight(root);
}
}
}
else
{
root->right = buildtree(root->left, x);
if (abs(GetHeight(root->left) - GetHeight(root->right)) == 2)
{
if (x < root->right->data)
{
root=RightLeft(root);
}
else
{
root=RightRight(root);
}
}
}
}