请输入您要查询的百科知识:

 

词条 左偏树
释义

堆结构是一种隐式数据结构(implicit data structure),用完全二叉树表示的堆在数

组中是隐式存贮的(即没有明确的指针或其他数据能够重构这种结构)。由于没有存贮结构信

息,这种描述方法空间利用率很高,事实上没有空间浪费。尽管堆结构的时间和空间效率都

很高,但它不适合于所有优先队列的应用,尤其是当需要合并两个优先队列或多个长度不同

的队列时。因此需要借助于其他数据结构来实现这类应用,左偏树( leftist tree)就能满足这

种要求。

左倾树是一种二叉树,它的节点除了和二叉树的节点一样具有左右子树指针(left、right)外,还有两个属性:键值和距离(dist)。键值上面已经说过,是用于比较节点的大小。距离则是如下定义的:

一个具有空左子树或空右子树的节点称为外节点;一个节点的距离是这个节点到最近的外节点所经过的边的数目(最近的意思是边的数目最小),特别的,如果一个节点本身是外节点,则它的距离为0;而空节点的距离规定为-1(后面将会看到这样规定的理由)。在本文中,有时也提到一棵树的距离,这是指该树根节点的距离。

左倾树的各个属性满足下面两条性质:

1. 一个节点的键值小于或等于它的左右子节点的键值(如果有子节点的话)。

2. 一个节点的左子节点的距离大于或等于右子节点的距离。

这两条性质是对每一个节点而言的,可以简单的从中得出,左倾树的左右子树都是左倾树。

不难看到,左倾树的根节点是树中所有节点里键值最小的,它的每一棵子树也具有这样的性质。这样的性质称为堆性质,具有堆性质的数据结构称为堆(heap)。因此左倾树是一种堆。堆是实现优先队列的很好的数据结构,因为我们可以立即取到堆中的最小元素。

Leftise Tree主要有以下关键操作

1. PopMin(取出最小节点)

2. Merge(a,b)(合并分别以a和b为根的树)

3. Insert(v)(插入值为v的新节点)

以上操作的复杂度均为Θ(lg n)。

Merge是最关键的操作,通过递归调用来实现,具体思想是:如果a的键值小于b的键值,那么合并a的右枝与b,否则合并a与b的右枝,直到其一为空。但是这样的合并操作有可能打破了左偏树的性质2,这时只要交换根的左枝和右枝即可,并更新根节点的高度。

Insert过程可以视为将只有一个新节点的树与原树合并,初始化一棵新树后调用Merge即可。

Popmin过程中取出根节点的键值,然后合并左右子树,将得到的根作为新的根即可。

关于复杂度的保证可以参见左偏树的这一定理:若一棵左偏树有N个节点,则该左偏树的距离不超过 [log(N+1) ]-1。

而Merge过程只会沿两棵树的最右路径进行,显然复杂度是Θ(lg n)的。

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/3/21 14:55:47