什么是左式堆
左式堆是一种有效地支持堆的合并操作的高级数据结构。左式堆既有二叉堆的结构性质,又有堆序性质。但和二叉堆不同,左式堆同时也是一棵二叉树,而二叉堆可以简化为数组。左式堆不是理想平衡的,事实上它也是趋于不平衡的。
左式堆的性质
我们把任一节点X的零路径长(null path length)npl(x)定义为从X节点到一个不具有两个儿子的节点的最短路径的长度。
因此,具有0个或1个孩子的节点的npl值为0,而npl(null)= -1。比如如下这棵树,节点里的数字表示该节点的零路径长。
1 1
/ \ / \
1 0 1* 0
/ \ / \
0 0 0 1
/ / \
0 0 0
k1 k2
这里可以简单概括一个规律:任一节点的零路径长(npl)等于它的两个儿子中的最小值+1。
而左式堆的性质是:对于堆中的任一节点X,左儿子的零路径长总大于或等于右儿子的零路径长。
比如上图,k1是左式堆而k2不是,因为k2中打*的节点左儿子的npl比右儿子小。
因此对于左式堆,结合左式堆的性质和总结出的规律,可以得到:左式堆中任一节点的零路径长等于右儿子的零路径长+1,即 npl(t) = npl(t->right) + 1
。这对于没有右孩子的节点同样适用,因为npl(NULL) = -1
。
左式堆的操作
#include<iostream>
using namespace std;
template<typename T>
class LeftistNode{
public:
T element;
LeftistNode*left;
LeftistNode*right;
int npl; //记录当前节点的npl值