左式堆的實現與詳解

2021-09-08 03:49:59 字數 3542 閱讀 9296

定義:左式堆(leftist heaps)又稱作最左堆、左傾堆,是計算機語言中較為常用的乙個資料結構。左式堆作為堆的一種,保留了堆的一些屬性。第1,左式堆仍然以二叉樹的形式構建;第2,左式堆的任意結點的值比其子樹任意結點值均小(最小堆的特性)。但和一般的二叉堆不同,左式堆不再是一棵完全二叉樹(complete tree),而且是一棵極不平衡的樹。

性質:

零路徑長:從x到乙個不具有兩個兒子的結點的最短路徑的長。

1. 任一結點的零路徑長比他的諸兒子結點的零路徑長的最小值多1

2. 父節點屬性值小於子節點屬性值;

3. 堆中的任何節點,其左兒子的零路徑長》=右兒子的零路徑長的二叉樹。

操作:

左式堆的操作都是基於合併,而合併僅對右路做合併,而右路結點的數量為總數量的對數關係,所以左式堆的三個操作(合併,刪除,插入)所花的時間為o(logn).

左式堆的合併操作基於遞迴完成,演算法如下:

1.如果有一棵樹是空樹,則返回另一棵樹;否則遞迴地合併根結點較小的堆的右子樹根結點較大的堆

2.使形成的新堆作為較小堆的右子樹。

3.如果違反了左式堆的特性,交換兩個子樹的位置。

4.更新npl。

刪除最小值/最大值:

刪除操作的做法相當的簡單,刪除左式堆的根節點,合併左右子樹即可。

插入:將需要插入的節點當做一棵左式堆樹,進行合併即可。

下面給出左式堆的c++類模板實現

左式堆實現

左式堆是為了方便合併操作實現的。左式堆性質 任意節點x的零路徑長是x到任意沒有兩個兒子的節點的最短路徑。任意乙個節點的零路徑長比他兒子的零路徑長的最大值大1,null的零路徑長是 1 對於x來說,他的左兒子的零路徑長要大於等於右兒子。通過遞迴實現 如下 public class leftisthea...

左式堆的合併

二叉堆對於合併操作是困難的,因為需要把乙個陣列拷貝到另乙個陣列。左式堆可以高效的地支援合併操作,左式堆與二叉樹之間唯一區別是,左式堆不是平衡的,可能非常趨向不平衡。左式堆的結構 typedef struct treenode leftistheap 任一節點x的零路徑長npl x 定義為從x到乙個沒...

左式堆的簡單實現 C語言描述

左式堆是優先佇列的一種實現,它的目的主要是為了解決二叉堆的合併問題 你將在後面看到左式堆是如何用遞迴來優美地進行合併的 零路徑長 把任意節點x的零路徑長 null path length,npl npl x 定義為從x到乙個沒有兩個兒子的節點的最短路徑長。因此,具有0個或1個兒子的節點的npl值為0...