【ACM】数据结构与算法之左偏树

左偏树的定义
  • 左偏树(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年论文:左偏树的特点及其应用(广东省中山市第一中学 黄源河)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章