Leftist Heaps
Npl(X) = min { Npl(C) + 1 for all C as children of X }
The leftist heap property is that for every node X in the heap, the null path length of the left child is at least as large as that of the right child.
如果只有一个节点是其自身的话,那么这个节点的NPL就是0
- 定理:
A leftist tree with r nodes on the right path must have at least 2^r – 1 nodes.
- 首先完成merge操作
代码实现:
左偏堆,或者说左偏堆(Leftist Heap),它相比于普通的堆,更好的一点在于它支持快速的堆合并操作。“左偏”,并不断将新的东西往右侧合并,来实现每次都是往相对小的那一侧塞进东西,进而保相对证了这个
由于左偏堆不再是一个完全二叉树,所以我们不能再像维护大根堆小跟堆那样用数组来维护它了。
一个左偏堆的结点维护了左右子堆的地址、自身的键值、和一个“距离(dist)”
- 如果一个结点的左孩子或右孩子为空结点,则该结点的 dist 为 0,这种结点被称为外结点;
0
- 如果一个结点的左孩子和右孩子都不为空,则该结点的 dist 为 min(distleft child,distright child)+1;
Skew Heaps
a simple version of the leftist heaps
Always swap the left and right children except that the largest of all the nodes on the right paths does not have its children swapped. No Npl.
左偏堆是结点的键值应当不大于(不小于)其孩子结点的键值的二叉树(即堆的性质),且满足「左偏」性质——结点的左孩子的 dist 不小于右孩子的 dist。
一些例子
先全部排序然后再进行交换就可以实现了
注意一下操作,就是把一个节点的插入当成是merge就行
需要注意的是如果一个节点的两个子节点都是null,那么默认右节点是null,然后把对应的值插入到左节点就好
双向队列
总的来说,题目比较简单,主要记住几个操作的时间复杂度和代码即可