左式堆
不需要搜索,因此不需要平衡。
合并
思路:沿着右藤遍历并进行二路归并,每次取两堆中较小的节点连接,左子树不变。 时间复杂度渐近等于右侧藤长度。 如何控制藤长?
NPL
定义 npl 为当前节点到最近的空节点的距离。 在保持堆序性的基础上,保证 ,即倾向于在左子树尽可能多地分配节点。
- ! 左子树的规模和高度不一定大于右子树
有
右侧藤长度为 的左式堆至少包含高度为 的满子树,即包含至少 个节点。 反过来,包含 个节点的左式堆,右侧藤长度
实现
递归实现:
- 若其中之一为空,返回另一子树。
- 保证 节点大于 节点(否则交换)
- 将原来的 的右子树和 继续递归地进行合并并接回作为 的新右子树
- 回溯时,保证左子树的 npl 大于等于右子树(否则交换),更新当前节点的 npl 时间复杂度为
插入
视为原堆和单节点的合并
删除
删去根后将左右子树合并