左偏樹的定義
-
左偏樹(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年論文:左偏樹的特點及其應用(廣東省中山市第一中學 黃源河)