Treap树(代码)

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


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值