首先,我们学习一个比较简单的东西: 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

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

被折叠的 条评论
为什么被折叠?



