简析平衡树(二)——Treap

本文介绍了Treap数据结构,它是二叉搜索树与堆的结合,通过随机化的优先级实现自平衡。文章详细讲解了Treap的平衡原理、基础操作包括插入、删除和旋转,以及查询操作,并提供了完整的C++实现代码模板。学习Treap对于理解自平衡树的实现机制非常有帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

学完了替罪羊树,我决定再去学一学 T r e a p Treap Treap。一直听说 T r e a p Treap Treap很难,我也花了挺久才学会。


简介

T r e a p Treap Treap这个名字真的挺有内涵:

T r e e \color{red}{Tree} Tree+ H e a p \color{blue}{Heap} Heap= T r e \color{red}{Tre} Tre+ e a p \color{blue}{eap} eap= T r e a p \color{red}{Tr}\color{purple}{e}\color{blue}{ap} Treap

这很形象地告诉了我们: T r e a p Treap Treap T r e e Tree Tree(二叉搜索树)与 H e a p Heap Heap(堆)的结合体,这也是 T r e a p Treap Treap能够平衡的关键。


T r e a p Treap Treap平衡的方法

T r e a p Treap Treap为什么能够平衡?它与普通的 B S T BST BST有什么区别?

主要就在于,它比 B S T BST BST多了一个优先级的设定。

首先, T r e a p Treap Treap的节点是满足 B S T BST BST性质的。其次, T r e a p Treap Treap的每一个节点还有一个优先级,而这些优先级又是满足堆性质的。这就能让 T r e a p Treap Treap的节点保持一种随机的状态,而不会被数据卡成链(当然,脸黑也没办法)。

至于如何让它同时满足 B S T BST BST性质和堆性质,这放在后面再讲。

那么,该怎么确定优先级呢?

很简单,随机即可。

不过,直接用 C + + C++ C++自带的 r a n d ( ) rand() rand()又慢又容易被卡,所以推荐手写 r a n d ( ) rand() rand(),下面的代码仅供参考:

inline int Rand()
{
   
	static ull r=2333;//static不能少,r的初值可以自己定
	return (r*=233333)%=2147483647;//每次r乘上的数也可以自己定
}

T r e a p Treap Treap的基础操作
  • 旋转

    旋转应该是 T r e a p Treap Treap最重要也是最核心的操作了。

    T r e a p Treap

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值