左式二叉堆

2022-09-20 06:12:10 字數 1407 閱讀 7839

定義:

零路徑長npl(x):定義為從x到乙個沒有兩個兒子的節點的最短路徑長。 npl(x) = min + 1 (定義npl(null) = -1,那麼這個公式滿足只有乙個子節點的節點)

左式堆的性質:1、結構性質(對於堆中的任一節點,左兒子的零路徑長至少與右兒子的零路徑長一樣大) 2、堆序性質:和二叉樹的相同,節點的值大於等於其父節點的值

一些有趣的結論:

1、左式堆的零路徑就是沿著節點的右路徑,否則,如果存在一條零路徑並取得左兒子,說明npl(lchild) < npl(rchild),破壞了左式堆的結構性質。

2、在根節點右路徑上有r個節點的左式堆必然至少有2r - 1個節點。

左式堆的操作:

對左式堆的基本操作是合併,注意插入只是合併的基本操作。

資料結構定義如下:

1

struct

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實現**如下:

1

priorityqueue merge(priorityqueue h1, priorityqueue h2)

1112

priorityqueue merge1(priorityqueue h1, priorityqueue h2)

22return

h1;23 }

insert1實現**如下:(insert的巨集定義是為了和堆的insert的函式的使用方式一樣)

1

priorityqueue insert1(elementtype x, priorityqueue h)

deletemin1實現**如下:(deletemin的巨集定義與insert的意義類似)

1

priorityqueue 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個元素入堆。實驗原理 二叉 堆是乙個陣列,它可以被看成乙個近似的完全二叉樹。樹上的每乙個結點對應陣列中的乙個元素。除了最底層外,該...