左偏树
前言
左偏树是一种可并堆,顾名思义,它支持快速合并。
定义
定义外界点为孩子数量小于等于 \(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\) 无需更新可直接返回。
可打标记且不改变相对大小的全局操作
给根打标记,操作时下传。
求所在堆的根
可使用并查集维护。
复杂度分析
咕。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具