现在的位置: 首页 > 综合 > 正文

堆:左倾树

2019年03月11日 ⁄ 综合 ⁄ 共 2399字 ⁄ 字号 评论关闭

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

 

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

 

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

 

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

 

下面是实现代码:

下面是试验结果:

 

抱歉!评论已关闭.