定義:
零路徑長npl(x):定義為從x到乙個沒有兩個兒子的節點的最短路徑長。 npl(x) = min + 1 (定義npl(null) = -1,那麼這個公式滿足只有乙個子節點的節點)
左式堆的性質:1、結構性質(對於堆中的任一節點,左兒子的零路徑長至少與右兒子的零路徑長一樣大) 2、堆序性質:和二叉樹的相同,節點的值大於等於其父節點的值
一些有趣的結論:
1、左式堆的零路徑就是沿著節點的右路徑,否則,如果存在一條零路徑並取得左兒子,說明npl(lchild) < npl(rchild),破壞了左式堆的結構性質。
2、在根節點右路徑上有r個節點的左式堆必然至少有2r - 1個節點。
左式堆的操作:
對左式堆的基本操作是合併,注意插入只是合併的基本操作。
資料結構定義如下:
1struct
treenode;
2 typedef struct treenode *priorityqueue;34
priorityqueue initialize();
5elementtype findmin(priorityqueue h);
6int
empty(priorityqueue h);
7priorityqueue merge(priorityqueue h1, priorityqueue h2);89
#define insert(x, h) (h = insert1((x), h));
10#define deletemin1(h) (h->element;h = deletemin1(h);)
1112
priorityqueue insert1(elementtype x, priorityqueue h);
13 priorityqueue deletemin1(priorityqueue h);
merge實現**如下:
1priorityqueue merge(priorityqueue h1, priorityqueue h2)
1112
priorityqueue merge1(priorityqueue h1, priorityqueue h2)
22return
h1;23 }
insert1實現**如下:(insert的巨集定義是為了和堆的insert的函式的使用方式一樣)
1priorityqueue insert1(elementtype x, priorityqueue h)
deletemin1實現**如下:(deletemin的巨集定義與insert的意義類似)
1priorityqueue deletemin1(priorityqueue h)
heap的一些實現,二叉堆,左式堆,二項佇列
這裡的堆指的都是二叉堆,為了優先佇列產生 優先佇列,使一些特殊的結點在出隊的時候要優先出來。出隊入隊操作變成了insert和delete 堆是乙個完全二叉樹,除了最後一層,其餘層都是滿的。這樣的話儲存用乙個陣列就可以,任乙個元素位置在i,其左兒子位置是2 i,右兒子位置是2 i 1,父結點是i 2向...
左式堆實現
左式堆是為了方便合併操作實現的。左式堆性質 任意節點x的零路徑長是x到任意沒有兩個兒子的節點的最短路徑。任意乙個節點的零路徑長比他兒子的零路徑長的最大值大1,null的零路徑長是 1 對於x來說,他的左兒子的零路徑長要大於等於右兒子。通過遞迴實現 如下 public class leftisthea...
(二叉)堆操作
堆操作 實驗目的 一 建堆 將陣列a 1.n 變成乙個最大堆。二 堆排序 將乙個堆中的元素按遞減排序輸出。三 用插入方法建堆 堆大小從1到n每次插入乙個元素到堆中,直到n個元素入堆。實驗原理 二叉 堆是乙個陣列,它可以被看成乙個近似的完全二叉樹。樹上的每乙個結點對應陣列中的乙個元素。除了最底層外,該...