左偏树的定义
-
左偏树(Leftist Tree)是一种可并堆(Mergeable Heap) ,它除了支持优先队列的三个基本操作(插入,删除,取最小节点),还支持一个很特殊的操作——合并操作。
-
左偏树是一棵堆有序(Heap Ordered)二叉树。
-
左偏树满足左偏性质(Leftist Property)。
左偏树的定义 —— 左偏性质
-
定义一棵左偏树中的外节点(External Node) 为左子树或右子树为空的节点。
-
定义节点 i 的距离(dist(i)) 为节点 i 到它的后代中,最近的外节点所经过的边数。
-
任意节点的左子节点的距离不小于右子节点的距离(左偏性质)。
由左偏性质可知,一个节点的距离等于以该节点为根的子树最右路径的长度。
左偏树的性质
定理:若一棵左偏树有N个节点,则该左偏树的距离不超过 ⎣log(N+1)⎦ -1。
左偏树的操作
- MakeNull —— 初始化一棵空的左偏树
- Merge —— 合并两棵左偏树
- Insert —— 插入一个新节点
- Min —— 取得最小节点
- DeleteMin —— 删除最小节点
- Delete —— 删除任意已知节点
- Decrease —— 减小一个节点的键值
左偏树的操作 —— 合并
合并操作是递归进行的。
Function Merge(A, B)
If A = NULL Then return B
If B = NULL Then return A
If key(B) < key(A) Then swap(A, B)
right(A) ← Merge(right(A), B)
If dist(right(A)) > dist(left(A)) Then
swap(left(A), right(A))
If right(A) = NULL Then dist(A) ← 0
Else dist(A) ← dist(right(A)) + 1
return A
End Function
下面是一个合并的例子:
合并操作都是一直沿着两棵左偏树的最右路径进行的。
一棵N个节点的左偏树,最右路径上最多有 ⎣log(N+1)⎦ 个节点。
因此,合并操作的时间复杂度为:
O(log N1 + log N2) = O(log N)
左偏树的操作 —— 插入
插入一个新节点
- 把待插入节点作为一棵单节点左偏树
- 合并两棵左偏树
- 时间复杂度:O(log N)
左偏树的操作 —— 删除
删除最小节点
- 删除根节点
- 合并左右子树
- 时间复杂度:O(log N)
总结
左偏树的特点:
- 时空效率高
- 编程复杂度低
左偏树的应用:
- 可并堆
- 优先队列
参考
国家集训队2005年论文:左偏树的特点及其应用(广东省中山市第一中学 黄源河)