左式堆的基本操作

什么是左式堆

左式堆是一种有效地支持堆的合并操作的高级数据结构。左式堆既有二叉堆的结构性质,又有堆序性质。但和二叉堆不同,左式堆同时也是一棵二叉树,而二叉堆可以简化为数组。左式堆不是理想平衡的,事实上它也是趋于不平衡的。

左式堆的性质

我们把任一节点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值

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值