什么是左式堆


什么是左式堆?


左式堆定义:

具有,如下性质

1、父节点属性值小于子节点属性值;

2、堆中的任何节点,其左儿子的零路径长>=右儿子的零路径长;

的二叉树。

注:零路径长(npl)是指:从一个节点X开始到一个不具有两个儿子的Y节点的最短路径的长,可以看出有0个或者一个儿子的节点的npl=0,并且定义npl(null)=-1;



  左式堆(Leftist Heaps)又称作最左堆、左倾堆,是计算机语言中较为常用的一个数据结构。左式堆作为堆的一种,保留了堆的一些属性。第1,左式堆仍然以二叉树的形式构建;第2,左式堆的任意结点的值比其子树任意结点值均小(最小堆的特性)。但和一般的二叉堆不同,左式堆不再是一棵完全二叉树(Complete tree),而且是一棵极不平衡的树。

   一:Npl.
  左式堆的结点相比于一般的堆来说,增加了Npl属性,Npl是 null path length 的缩写,指的是从该结点到达一个没有两个孩子的结点的最短距离(一个孩子的结点或者叶子)。一般定义NULL的Npl为-1以使计算简便。 容易得到,任意结点的Npl是它的孩子的Npl中较小的那个结点的Npl+1.
   二:左式堆
  左式堆除了保留堆的二叉树属性和最小堆属性外,有一个特征属性: 任意结点的左孩子的Npl大于等于右孩子的Npl。 这个特性决定了左式堆的不平衡性,并且明显左边会比较深,这就是左式堆的得来。由这个性质和上面提到的性质可以得到: 左式堆任意结点的Npl为右孩子的Npl+1.
   三:定理
   沿右路共有r个结点的左式堆至少有2^r-1个结点。 这个定理的证明比较容易,利用迭代即可,这里就不赘述了。
   四:左式堆的操作
  左式堆的最基本的操作就是合并(Merge),之所以把它构造成这样一个不平衡的堆,就是为了使它相对于一般的二叉堆来说,合并变得非常地容易。左式堆的合并共有四步:
  1.如果有一棵树是空树,则返回另一棵树;否则递归地合并 根结点较小的堆的右子树 根结点较大的堆
  2.使形成的新堆作为较小堆的右子树。
  3.如果违反了左式堆的特性,交换两个子树的位置。
  4.更新Npl。
  左式堆的插入(Insert)很简单,其实也就是一个单结点和原堆的合并。
  左式堆的DleteMin也很简单,就是把根结点删除,把两棵子树合并。左式堆的删除可以考虑懒惰删除(Lazy Delete)。
   五:时间复杂度
  由于上述的操作均基于合并,而合并仅对右路做合并,而右路结点的数量为总数量的对数关系,所以左式堆的三个操作所花的时间为 O(logN).
   六:变形
  左式堆的变形最常见的就是斜堆(Skew Heaps),实际上,斜堆并不是一个非常好用的数据结构,所以这里就不讲述了。.





你可能感兴趣的:(高等数据结构和算法)