Treap详解 & Treap代码注意事项与总结

博客主要介绍了二叉排序树(BST)和Treap两种数据结构。详细阐述了BST的建立、搜索、插入等基本操作,分析其复杂度,指出易退化为链的问题。接着引入Treap,说明通过随机赋予堆码和旋转操作保证树的平衡与BST性质,还给出了Treap实现的注意事项。

首先,我们学习一个比较简单的东西: BST(Binary Search Tree),即二叉排序树。

BST

Description

在这里插入图片描述

Solution

二叉排序树是满足下面条件的一棵二叉树: 对于任何一个节点 r t rt rt,它的关键码大于所有在其左子树内的关键码,但是小于所有在其右子树内的关键码。这也被称为BST性质

对于某些题目,我们需要在修改的同时维护这个数据结构,在查询的时候快速得到答案。我们先假设任何时候二叉排序树内不存在任何两个相同的节点使得它们的关键码相同

下面为了方便叙述,假设第 i i i个节点的关键码为 v a l i val_i vali,左孩子为 l s o n i lson_i lsoni,右孩子为 r s o n i rson_i rsoni

B S T BST BST的建立。

初始时, B S T BST BST长这样:

在这里插入图片描述
即,根节点为负无穷大,其唯一的右孩子为正无穷大。

②搜索一个数 x x x
从根节点向下递归,假设目前递归到了节点 r t rt rt
(1)如果 v a l r t = x val_{rt}=x valrt=x,那么搜索成功;
(2)如果 x < v a l r t x<val_{rt} x<valrt,向左递归;
(3)否则向右递归。


③插入一个数 x x x
我们向下递归。假设目前递归到了节点 r t rt rt
(1)如果 r t rt rt 0 0 0,说明目前走到了一个空节点上。此时我们就在这个位置新建一个节点即可。
(2)如果 x < v a l r t x<val_{rt} x<valrt,就向左子树递归;
(3)如果 x > v a l r t x>val_{rt} x>valrt,就向右子树递归。

在这里插入图片描述


④查询 x x x树的排名。
我们对于每一个BST上的节点多维护一个量 s i z e size size,表示以其为根的子树大小。这可以通过递归来算出,即这个节点的 s i z e size size等于其左孩子(如果有的话)的 s i z e size size加上右孩子(如果有的话)的 s i z e size size再加上 1 1 1。特别地,对于一个新建的节点,其 s i z e size size 1 1 1

我们向下递归。定义一个变量 p p p,表示目前比 x x x的数有多少个。假设目前递归到了 r t rt rt:
(1)如果 r t = 0 rt=0

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值