堆之斜堆

斜堆

斜堆(skew heap)是左倾堆的一个变种,与左倾堆一样,合并的时间复杂度也是O(lgn)。相对于左倾堆来说,斜堆没有零距离这个概念,而是在合并操作的时候,每次交换左右子树。

斜堆的定义:

  • 左子树
  • 右子树
  • 键值

合并操作图解

与左倾堆相同,合并操作也是斜堆的重点。合并两个斜堆的过程如下:

  • 如果一个空斜堆与非空斜堆合并,返回非空斜堆;
  • 如果两个斜都非空,比较两个根节点,取优先级高的根节点为新的根节点。将“优先级较高堆的根节点的右孩子”和“优先级底的堆”进行合并;
  • 合并后,交换新堆根节点的左孩子和右孩子;

需要合并的两个堆如下:

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

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

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

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

至此,两颗树合并完成!下面要进行结点交换:

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

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

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

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

至此,两个堆合并完成!

最后,Demo 在这里