Algorithms: Treap树

Treap(树)其实就是二叉树的加强版,只不过多了一个优先级,并要求其优先级满足堆序!


 

 

/*--------------------------------------------------------------------------------------
 * Project: Main.cpp
 * Name: zwp
 * Date: 2014/4
 *--------------------------------------------------------------------------------------*/



#include <stdio.h>
#include <stdlib.h>
#include "Treap.h"


int main(int argc, char* argv[])
{
	Treap T = Initialize();


	for(int index = 0; index < 10; ++ index)
		Insert(index, T);

	Travse(T);

	system("pause");
	return 0;

}


 

 

/*----------------------------------------------------------------------------------
 * Project: Treap.h
 * Name: zwp
 * Date: 2014/4
 *----------------------------------------------------------------------------------*/



#ifndef TREAP_H_
#define TREAP_H_



typedef int ElementType;

struct TreeNode;
typedef struct TreeNode *Treap;



/*
** 初始化
*/
Treap Initialize(void);

/*
** 判空
*/
bool IsEmpty(Treap T);


/*
** 插入
*/
Treap Insert(ElementType item, Treap T);


/*
** 删除
*/
Treap Remove(ElementType item, Treap T);

/*
** 搜索
*/
Treap Search(ElementType item, Treap T);

/*
** 遍历
*/
void Travse(Treap T);



#endif


 

/*------------------------------------------------------------------------------------
 * Project: Treap.cpp
 * Name: zwp
 * Date: 2014/4
 *------------------------------------------------------------------------------------*/


#include "Treap.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>

/*
** define  Treap Tree
*/
struct TreeNode
{
	ElementType Element;
	TreeNode* Left;
	TreeNode* Right;
	int       Priority;
};



static int Random(void)
{
	srand(time(0));

	return rand();
}



/*
** 右旋转
*/
static Treap SingleRotateWithLeft(Treap K2)
{
	Treap K1;

	K1 = K2->Left;
	K2->Left = K1->Right;
	K1->Right = K2;

	return K1;
}


/*
** 左旋转
*/
static Treap SingleRotateWithRight(Treap K2)
{
	Treap K1;

	K1 = K2->Right;
	K2->Right = K1->Left;
	K1->Left = K2;
	 
	return K1;
}


/*
** 初始化
*/
Treap Initialize(void)
{
	TreeNode* N = (TreeNode*)malloc(sizeof(struct TreeNode));
	if(N == NULL)
		printf("Out of space....\n");

	N->Left = N->Right = NULL;
	N->Element = 0;
	N->Priority = 0;

	return N;
}



/*
** 判空
*/
bool IsEmpty(Treap T)
{
	return T ? false : true;
}



/*
** 插入
*/
Treap Insert(ElementType item, Treap T)
{
	if(T == NULL)
	{
		/* Create and return a one-node tree */
		T = (TreeNode*)malloc(sizeof(struct TreeNode));
		if(T == NULL)
			printf("Out of space...\n");
		else
		{
			T->Element = item;
			T->Left = T->Right = NULL;
			T->Priority = Random();				/* 优先级为随机数 */
		}
	}
	else if(item < T->Element)
	{
		T->Left = Insert(item, T->Left);
		if(T->Left->Priority < T->Priority)		/* 优先级要满足堆序 */
			T = SingleRotateWithLeft(T);		/* 右旋转 */

	}
	else if(item > T->Element)
	{
		T->Right = Insert(item, T->Right);
		if(T->Right->Priority < T->Priority)
			T = SingleRotateWithRight(T);		/* 左旋转 */

	}
	/* Otherwise, it's already in Treap-Tree */
	
	return T;
}


/*
** 删除
*/
Treap Remove(ElementType item, Treap T)
{
	if(T != NULL)
	{
		if(item < T->Element)
			T->Left = Remove(item, T->Left);
		else if(item > T->Element)
			T->Right = Remove(item, T->Right);
		else
		{
			/* 左子枝的优先级小于右子枝的优先级 则执行右旋 */
			if(T->Left->Priority < T->Right->Priority)
				T = SingleRotateWithLeft(T);
			/* 负责执行左旋 */
			else
				T = SingleRotateWithRight(T);

			/* 删除它 */
			if(T != NULL)
				T = Remove(item, T);
			else
			{
				/* 在树叶子上 */
				free(T->Left);
				T->Left = NULL;
			}
		}
	}
	return T;
}




/*
** 删除
*/
Treap Search(ElementType item, Treap T)
{
	if(T != NULL)
	{
		if(item < T->Element)
			T->Left = Search(item, T->Left); 
		else if(item > T->Element)
			T->Right = Search(item, T->Right);
		else
			return T;
	}
	else
	{
		printf("The TreapTree is Empty....\n");
		return NULL;
	}

}



/*
** 遍历
*/
void Travse(Treap T)
{
	if(T != NULL)
	{
		Travse(T->Left);
		printf("%d  \n", T->Element);
		Travse(T->Right);

	}
}


 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值