PS:傻老鼠脑子糊涂了,首先树得满足BST的性质,然后空下来时维护Heap的性质大功告成,如今该知道节点里面应该放什么了。
分裂过程担当两个参数:根指针 \(\textit{cur}\)、关键值 \(\textit{key}\)。结果为将根指针指向的 treap 分裂为两个 treap,第一个 treap 全部结点的值\(\textit{val}\)小于等于 \(\textit{key}\),第二个 treap 全部结点的值大于 \(\textit{key}\)。老鼠才不会解释,由于老鼠没脑子。
该过程首先判断 \(\textit{key}\) 是否小于 \(\textit{cur}\) 的值,若小于,则说明 \(\textit{cur}\) 及其右子树全部大于 \(\textit{key}\),属于第二个 treap。当然,也可能有一部门的左子树的值大于 \(\textit{key}\),以是还需要继续向左子树递归地分裂。对于大于 \(\textit{key}\) 的那部门左子树,我们把它作为 \(\textit{cur}\) 的左子树,这样,整个 \(\textit{cur}\) 上的节点都是大于 \(\textit{key}\) 的。
相应的,如果 \(\textit{key}\) 大于等于 \(\textit{cur}\) 的值,说明 \(\textit{cur}\) 的整个左子树以及其自身都小于 \(\textit{key}\),属于分裂后的第一个 treap。并且,\(\textit{cur}\) 的部门右子树也可能有部门小于 \(\textit{key}\),因此我们需要继续递归地分裂右子树。把小于 \(\textit{key}\) 的那部门作为 \(\textit{cur}\) 的右子树,这样,整个 \(\textit{cur}\) 上的节点都小于 \(\textit{key}\)。
下图展示了 \(\textit{cur}\) 的值小于等于 \(\textit{key}\) 时按值分裂的情况. ——OIWIKI
归并过程担当两个参数:左 treap 的根指针 \(\textit{u}\)、右 treap 的根指针 \(\textit{v}\)。必须满足 \(\textit{u}\) 中全部结点的值小于等于 \(\textit{v}\) 中全部结点的值。一样平常来说,我们归并的两个 treap 都是原来从一个 treap 中分裂出去的,以是不难满足 \(\textit{u}\) 中全部节点的值都小于 \(\textit{v}\)Merge
在旋转 treap 中,我们借助旋转操作来维护 \(\textit{priority}\) 符合堆的性质,同时旋转时还不能改变树的性质。在无旋 treap 中,我们用归并达到相同的结果。
由于两个 treap 已经有序,以是我们在归并的时间只需要思量把哪个树「放在上面」,把哪个「放在下面」,也就是是需要判断将哪个一个树作为子树。显然,根据堆的性质,我们需要把 \(\textit{priority}\) 小的放在上面(这里采用小根堆)。
同时,我们还需要满足搜索树的性质,以是若 \(\textit{u}\) 的根结点的 \(\textit{priority}\) 小于 \(\textit{v}\) 的,那么 \(\textit{u}\) 即为新根结点,并且 \(\textit{v}\) 由于值比 \(\textit{u}\) 更大,应与 \(\textit{u}\) 的右子树归并;反之,则 \(\textit{v}\) 作为新根结点,然后由于 u 的值比 \(\textit{v}\) 小,与 v 的左子树归并。——OIWIKI
老鼠懒,自己看。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |