斜堆
斜堆(skew heap)是左倾堆的一个变种,与左倾堆一样,合并的时间复杂度也是O(lgn)。相对于左倾堆来说,斜堆没有零距离这个概念,而是在合并操作的时候,每次交换左右子树。
斜堆的定义:
- 左子树
- 右子树
- 键值
合并操作图解
与左倾堆相同,合并操作也是斜堆的重点。合并两个斜堆的过程如下:
- 如果一个空斜堆与非空斜堆合并,返回非空斜堆;
- 如果两个斜都非空,比较两个根节点,取优先级高的根节点为新的根节点。将“优先级较高堆的根节点的右孩子”和“优先级底的堆”进行合并;
- 合并后,交换新堆根节点的左孩子和右孩子;
需要合并的两个堆如下:

第一步
堆 5大于堆 9,堆 5作为新堆,堆 5的右孩子和堆 9比较,结果如下:

第二步
堆 9的右孩子和堆 19比较,结果如下:

第三步
堆 15的右孩子和堆 19比较,结果如下:

第四步
堆 19的右孩子和堆 25比较,结果如下:

至此,两颗树合并完成!下面要进行结点交换:
第五步
堆 19的左、右孩子交换,结果如下:

第六步
堆 15的左、右孩子交换,结果如下:

第七步
堆 9的左、右孩子交换,结果如下:

最后一步
堆 5的左、右孩子交换,结果如下:

至此,两个堆合并完成!
最后,Demo 在这里