#include "stdafx.h"
#include <iostream>
using namespace std;
typedef struct node
{
int value;
node* left;
node* right;
int height;
node(int x):value(x),left(NULL),right(NULL),height(1){}
}node;
int height(node* p)
{
if(p == NULL)
return 0;
else
return p->height;
}
void SingleRoateLeft(node* &k2)
{
node* k1=k2->left;
k2->left = k1->right;
k1->right = k2;
k2->height = max(height(k2->left),height(k2->right))+1;
k1->height = max(height(k1->left),height(k1->right))+1;
k2 = k1;
}
void SingleRoateRight(node* &k2)
{
node* k1 = k2->right;
k2->right = k1->left;
k1->left = k2;
k2->height = max(height(k2->left),height(k2->right))+1;
k1->height = max(height(k1->left),height(k1->right))+1;
k2 = k1;
}
void DoubleRoateLR(node* &k3)
{
SingleRoateRight(k3->left);
SingleRoateLeft(k3);
}
void DoubleRoateRL(node* &k3)
{
SingleRoateLeft(k3->right);
SingleRoateRight(k3);
}
void InsertNode(node* &p, int x)
{
if(p == NULL)
{
p = new node(x);
return ;
}
if(x < p->value)
{
InsertNode(p->left,x);
if(2 == height(p->left) - height(p->right))
{
if(p->left->value > x)
{
SingleRoateLeft(p);
}
else
{
DoubleRoateLR(p);
}
}
}
else if(x > p->value)
{
InsertNode(p->right,x);
if(2 == height(p->right) - height(p->left))
{
if(p->right->value < x)
{
SingleRoateRight(p);
}
else
{
DoubleRoateRL(p);
}
}
}
else
{
return;
}
p->height = max(height(p->left),height(p->right))+1;
}
void DeleteNode(node* &p, int x)
{
if(p == NULL)
return ;
if(x < p->value)
{
DeleteNode(p->left,x);
if(2 == height(p->right) - height(p->left))
{
if(p->right->left && height(p->right->left) > height(p->right->right))
DoubleRoateRL(p);
else
SingleRoateRight(p);
}
}
else if(x > p->value)
{
DeleteNode(p->right,x);
if(2 == height(p->left)-height(p->right))
{
if(p->left->right && height(p->left->right) > height(p->left->left))
DoubleRoateLR(p);
else
SingleRoateLeft(p);
}
}
else
{
if(p->left && p->right)
{
node* temp = p->right;
while (temp->left)
{
temp = temp->left;
}
p->value = temp->value;
DeleteNode(p->right,temp->value);
if(2 == height(p->left)-height(p->right))
{
if(p->left->right && height(p->left->right) > height(p->left->left))
DoubleRoateLR(p);
else
SingleRoateLeft(p);
}
}
else
{
node* temp = p;
if(p->left == NULL)
p = p->right;
else if(p->right == NULL)
p = p->left;
delete temp;
temp = NULL;
}
}
if(p == NULL)
return;
p->height = max(height(p->left),height(p->right))+1;
}
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}