左偏树

前言

左偏树是一种可并堆,顾名思义,它支持快速合并。

定义

定义外界点为孩子数量小于等于 \(2\) 个的节点,\(dis(u)\) 表示节点 \(u\)最近的外节点经过的边数减 \(1\)。特别的,空节点的 \(dis\)\(-1\)

定义节点 \(u\) 权值为 \(val(u)\),左、右儿子分别为 \(ls(u),rs(u)\)。左偏树中可以出现重复的元素。

定义一棵以 \(u\) 为根节点的左偏树,它满足

  • \(dis(ls(u))\ge dis(rs(u))\)
  • 若有左右儿子,则左右子树均为左偏树。
  • \(u\) 为根节点的树是一个堆,即 \(val(u)\le val(ls(u)),val(rs(u))\)

本文的左偏树均为根堆。

性质

可得 \(dis(u)=dis(rs)+1\)

操作

合并

合并是左偏树的基本操作。

设合并两棵左偏树 \(x,y\),合并后根节点为 \(z=mrg(x,y)\),且 \(val(x)\le val(y)\),则取 \(z\gets x,ls(z)=ls(x),rs(z)=mrg(rs(x),y)\)。递归处理即可。

插入

新建一个节点直接合并即可。

删除根

合并根的左右儿子。

删除任意节点

将左右儿子合并替代自己,更新 \(dis\),不满足左偏性质时交换左右儿子。若 \(dis\) 无需更新可直接返回。

可打标记且不改变相对大小的全局操作

给根打标记,操作时下传。

求所在堆的根

可使用并查集维护。

复杂度分析

咕。

posted @   Po7ed  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示