左偏树是一种满足堆性质和左偏性质的二叉树结构,其核心操作合并的时间复杂度为O(log n),插入、删除等操作均基于合并实现,适用于频繁合并堆的场景。
左偏树(Leftist Tree),又称左偏堆,是一种可合并堆(Mergeable Heap),支持高效地合并两个堆,相比二叉堆在合并操作上更优。它常用于需要频繁合并堆的场景,比如优先队列的合并、Dijkstra算法的优化版本等。
左偏树是一种二叉树结构的堆,满足以下两个性质:
这个左偏性质保证了树向左“偏”,从而使得合并操作的时间复杂度为 O(log n)。
合并是左偏树的核心操作,其他操作如插入、删除都可以基于合并实现。
合并两个左偏树的基本思路如下:
注意:空节点的 s-value 定义为 0,非空叶节点的 s-value 为 1。
下面是一个简洁的小根左偏树实现:
#includeusing namespace std; struct LeftistNode { int val; int dist; // s-value: shortest path to a null node LeftistNode* left; LeftistNode* right; explicit LeftistNode(int v) : val(v), dist(0), left(nullptr), right(nullptr) {} }; // 合并两个左偏树,返回新的根节点 LeftistNode* merge(LeftistNode* a, LeftistNode* b) { if (!a) return b; if (!b) return a; // 维护小根堆:a 的值必须 <= b 的值 if (a->val > b->val) swap(a, b); // 递归合并 a 的右子树和 b a->right = merge(a->right, b); // 维护左偏性质 if (!a->left || (a->right && a->left->dist < a->right->dist)) { swap(a->left, a->right); } // 更新距离 a->dist = (a->right ? a->right->dist : 0) + 1; return a; } // 插入一个值 LeftistNode* insert(LeftistNode* root, int val) { return merge(root, new LeftistNode(val)); } // 删除最小值(根节点) LeftistNode* pop(LeftistNode* root) { if (!root) return nullptr; LeftistNode* left = root->left; LeftistNode* right = root->right; delete root; return merge(left, right); } // 获取最小值 int top(LeftistNode* root) { return root ? root->val : -1; // 假设所有值为正 } // 中序遍历用于调试(非必要) void inorder(LeftistNode* root) { if (root) { inorder(root->left); cout << root->val << "(dist=" << root->dist << ") "; inorder(root->right); } }
测试代码:
```cpp int main() { LeftistNode* heap = nullptr; heap = insert(heap, 3); heap = insert(heap, 1); heap = insert(heap, 5); heap = insert(heap, 2);cout << "Top: " << top(heap) << endl; // 输出 1 heap = pop(heap); cout << "New top: " << top(heap) << endl; // 输出 2 // 合并另一个堆 LeftistNode* heap2 = nullptr; heap2 = insert(heap2, 4); heap2 = insert(heap2, 0); heap = merge(heap, heap2); cout << "Merged top: " << top(heap) << endl; // 输出 0 return 0;
}
输出结果大致为:
Top: 1 New top: 2 Merged top: 0时间复杂度分析
所有主要操作的时间复杂度均为 O(log n):
左偏树的优势在于合并效率高,适合动态合并多个优先队列的场景。
基本上就这些。实现时注意指针安全和递归边界即可。
# c++
# node
# ai
# ios
# stream
# 递归
# int
# 数据结构
# 堆
# 算法
# 子树
# 是一种
# 较小
# 的是
# 是一个
# 最小值
# 二叉树
# 多个
# 遍历
相关文章:
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
如何通过免费商城建站系统源码自定义网站主题与功能?
完全自定义免费建站平台:主题模板在线生成一站式服务
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
手机网站制作与建设方案,手机网站如何建设?
,怎么在广州志愿者网站注册?
如何解决VPS建站LNMP环境配置常见问题?
python的本地网站制作,如何创建本地站点?
Swift开发中switch语句值绑定模式
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
深圳网站制作培训,深圳哪些招聘网站比较好?
Android自定义控件实现温度旋转按钮效果
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
如何用PHP工具快速搭建高效网站?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
如何通过万网虚拟主机快速搭建网站?
郑州企业网站制作公司,郑州招聘网站有哪些?
如何快速搭建高效香港服务器网站?
建站之星如何助力网站排名飙升?揭秘高效技巧
建站之星如何取消后台验证码生成?
广州商城建站系统开发成本与周期如何控制?
北京制作网站的公司,北京铁路集团官方网站?
设计网站制作公司有哪些,制作网页教程?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
如何通过PHP快速构建高效问答网站功能?
定制建站策划方案_专业建站与网站建设方案一站式指南
如何高效搭建专业期货交易平台网站?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
如何用y主机助手快速搭建网站?
如何获取免费开源的自助建站系统源码?
如何续费美橙建站之星域名及服务?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
西安专业网站制作公司有哪些,陕西省建行官方网站?
无锡营销型网站制作公司,无锡网选车牌流程?
已有域名能否直接搭建网站?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
建站主机无法访问?如何排查域名与服务器问题
视频网站制作教程,怎么样制作优酷网的小视频?
如何在IIS服务器上快速部署高效网站?
,制作一个手机app网站要多少钱?
建站之星24小时客服电话如何获取?
*请认真填写需求信息,我们会在24小时内与您取得联系。