#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
const int MAX = 100;
struct TreapNode
{
int key; //结点的值
int fix; //优先级
TreapNode *left; //左孩子
TreapNode *right; //右孩子
};
template<typename T>
T random(T beg, T end)
{
return beg + (end-beg)*rand()/(RAND_MAX+1.0);
}
//左旋
void Rotate_Left(TreapNode *&x)
{
TreapNode *p = x->right;
x->right = p->left;
p->left = x;
x = p;
}
//右旋
void Rotate_Right(TreapNode *&x)
{
TreapNode *p = x->left;
x->left = p->right;
p->right = x;
x = p;
}
//插入
void Insert_Treap(TreapNode *&p, int key)
{
if(!p)
{
p = new TreapNode;
p->left = NULL;
p->right = NULL;
p->key = key;
p->fix = random(1,100);
}
else
{
if(key < p->key)
{
Insert_Treap(p->left, key);
if(p->left->fix > p->fix)
Rotate_Right(p);
}
else
{
Insert_Treap(p->right, key);
if(p->right->fix > p->fix)
Rotate_Left(p);
}
}
}
//删除
void Delete(TreapNode *&p, int key)
{
if(key == p->key)
{
TreapNode *t;
if(!p->right && !p->left)
{
delete p;
p = NULL;
}
else
{
if(!p->right)
{
t = p;
p = p->left;
delete t;
}
else
{
if(!p->left)
{
t = p;
p = p->right;
delete t;
}
else
{
if(p->left->fix < p->right->fix)
{
Rotate_Right(p);
Delete(p->right, key);
}
else
{
Rotate_Left(p);
Delete(p->left, key);
}
}
}
}
}
else
{
if(key < p->key)
{
Delete(p->left, key);
}
else
{
Delete(p->right, key);
}
}
}
//输出
void Print(TreapNode *root)
{
if(root == NULL)
return;
Print(root->left);
cout << root->key << " : " << root->fix << endl;
Print(root->right);
}
//根节点
TreapNode *root;
int main()
{
srand((int)time(NULL));
for (int i=1; i<=5; ++i)
{
Insert_Treap(root,i);
}
Print(root);
for (i = 1; i < 5; ++i)
{
cout << endl;
Delete(root,i);
Print(root);
}
return 0;
}