堆:左倾树

堆是一种树型数据结构,一般组织成二叉树的形式。堆具有这样的属性,对于每一个节点,父节点上的元素大于子孙节点。具体实现可以用链表,也可以用数组。优先队列(Priority Queue)可以用堆来实现。下面介绍一种左倾树(Leftist Tree)的实现方式,参考Algorithms:a functional programming approach.

 

左倾树首先是堆,具有堆的属性。左倾树的每一个节点除空节点外,具有这些域:数据,距离,左子树,右子树。此处的距离不是指树的深度,而是指节点到达空节点经历的最少节点个数。规定空节点的距离是0。左倾树具有这样的特点,左子树上的距离大于等于右子树上的距离,左倾树的每一个子树都是左倾树。

 

左倾树一般提供这些操作:取最大值,插入一个元素,删除最大元素,归并(Merge)左倾树。插入一个元素操作,可以通过归并原左倾树和待插入元素构成的独苗来完成。删除最大元素,可以通过移除左倾树的根节点,然后归并左右子树来完成。

 

左倾树不是平衡树,之所以采用这种不平衡的结构是因为它归并操作比较省时,只需lgn的时间复杂度,比较容易保持堆的属性(对于每一个节点,父节点上的元素大于子孙节点)。左倾树体现了一种不平衡的美。AVL树体现平衡的美。各有各的美。

 

下面是实现代码:

下面是试验结果:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值