平衡树
平衡树: treap
= tree
+ heap
- Binary Search Tree: BST
- 当前节点的左子树中的任何一个点的权值,都小于,当前点的权值
- 当前节点的右子树中的任何一个点的权值,都大于,当前点的权值
- Heap: 大根堆
中序遍历: 左 根 右
本质: 动态维护一个有序数列
(1) 二叉搜索树 BST
常见操作:
- 插入:
insert()
- 删除:(叶子节点)
erase()
- 找 前驱 / 后继 (在中序遍历中的 前一个 / 后一个 位置)
++/--
- 找前驱:
- 存在左子树: 从当前节点先向左走一步,然后一直向右走到底 ✅
- 不存在左子树: 右上爬父节点,寻找到首个“父节点作为右儿子”的位置即可 ✅
- 找后继: 同理
- 找前驱:
- 找全局 max / min:
begin() / end()-1
- max: 从当前节点一直向右走
- min: 从当前节点一直向左走
- 求某个数的排名
- 求排名是k的数是哪个
- 比某个数小的最大值
- 比某个数大的最小值
前四个操作在#incldude<set>
里都有, 只有后面三个需要自己实现
(2) Treap
代码实现的过程中,一定要特别注意,哪些是引用
&p
!!!
(2.1) 节点的一般定义
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 |
|
注意, 我们需要 两个“哨兵”, 用于初始化
一开始,我们需要建一棵“空”的平衡树. 建两个哨兵:
- 一个编号为 1, key 为
-INF
- 另一个编号为 2, key 为
INF
C++ | |
---|---|
1 2 3 4 5 6 7 8 |
|
(2.2) zig
&& zag
左旋zag / 右旋zig 是 Treap 中最重要的两个辅助操作 💣
这里讲的 “一个点”(&p
) 指代的都是这颗子树的 root
右旋 (zig): 把一个点整到原位置的右子树上去 (比如这里的4号node)
左旋 (zag): 把一个点整到原位置的左子树上去 (比如这里的2号node)
zig 或 zag 后,会自动确保“中序遍历”的顺序不变
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
模板直接看下面的 "253 普通平衡树" 即可
253 普通平衡树¶
平衡树 纯模板题
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
- 插入数值 x
- 删除数值 x (若有多个相同的数,应只删除一个)
- 查询数值 x 的排名 (若有多个相同的数,应输出最小的排名)
- 查询排名为 x 的数值
- 求数值 x 的前驱 (前驱定义为小于 x 的最大的数)
- 求数值 x 的后继 (后继定义为大于 x 的最小的数)
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
|
265 营业额统计¶
找 前驱 和 后继
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
|