二叉樹學習筆記(二)之堆

2021-09-03 10:00:32 字數 2287 閱讀 5307

附上一張總結圖

是一類完全二叉樹,常用於實現排序,選擇最小(大)值和優先佇列等

**優先佇列:**一種特殊的佇列,佇列中元素出棧的順序是按照元素的優先權大小,而不是元素入隊的先後順序。

堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質:

即按完全二叉樹的結點編號排列,n個結點的關鍵字序列稱為

堆可分為:

堆的儲存結構型別與完全二叉樹有所不同,定義如下:

typdefstruct  heap;

//堆型別

/* 假設關鍵字型別為整型,大頂堆和小頂堆的優先函式可分別定義如下: */

intgreatprior

(int x,

int y)

intlessprior

(int x,

int y)

堆的篩選:將堆中指定的以 pos 結點為根的子樹調整為子樹,其前提是 pos 結點的左右子樹均為子堆。

篩選操作的過程:

演算法如下:

status swapheapelem

(heap &h,

int i,

int j)

temp = h.rcd[i]

; h.rcd[i]

= h.rcd[j]

; h.rcd[j]

= temp;

return ok;

}void

shiftdown

(heap &h,

int pos)

if(h.

prior

(h.rcd[pos]

.key,h.rcd[lc]

.key)

)swapheapelem

(h, pos, lc)

;//否則pos和較優先者lc交換位置

pos = lc;

//繼續向下調整

}}

該篩選演算法的時間複雜度為o(logn)

插入操作:將插入元素加到堆尾,此時須判別堆尾和其雙親結點是否滿足堆特性,若不滿足,則需要進行向上調整,將插入元素與雙親交換;交換後,插入元素若存在雙親且此雙親結點不滿足堆特性,則需要繼續重複上述過程。

步驟:

演算法如下:

status insertheap

(heap &h, rcdtype e)

return ok;

}

該插入演算法的時間複雜度為o(logn)。

篩選與插入區別

演算法如下:

void

makeheap

(heap &h, rcdtype *e,

int n,

int size,

int tag,

int(

* prior)

(keytype,keytype)

)}

該建堆演算法的時間複雜度為o(n)。

操作:刪除堆頂結點後,需對新的堆頂結點進行篩選

演算法如下:

status removefirstheap

(heap &h, rcdtype &e)

堆排序屬於選擇類排序。

選擇類排序的基本思想:在 n 個記錄中,第 i 趟(i = 1,2,…,n-1)在第 i 到 n 個記錄中選取關鍵字最小的記錄作為有序序列中的第 i 個記錄。選取最小關鍵字的策略決定了選擇類排序演算法的效率。

堆排序可採用大頂堆進行公升序排序,採用小頂堆進行降序排序

以大頂堆公升序排序為例

演算法如下:

void

heapsort

(rcdsqlist &l)

}

堆排序演算法的時間複雜度最壞為o(nlogn),空間複雜度為o(1)。

樹 二叉樹 堆

樹 樹是乙個無向無環圖,n個節點正好有n 1條邊,再任意加上一條邊就可以構成迴路。乙個結點的上乙個結點是這個結點父結點,這個節點是子結點,並且父結點和子結點是相對的。特別的,如果乙個結點沒有父結點,那這個結點是根節點 乙個結點沒有子結點,它是葉節點。二叉樹 如果乙個樹除了葉結點之外的其他每個結點都不...

二叉堆(完全二叉樹)

最小堆的實現 最小堆是一顆完全二叉樹 這裡用陣列實現完全二叉樹 index 0 1 2 3 4 5 6 value 空 a b c d 任意index,其父親為index 2,左兒子為2 index,右兒子為2 index 1 時間複雜度 o logn include includeusing na...

樹 二叉樹 滿二叉樹 完全二叉樹 堆 概念彙總

樹 乙個擁有n 個節點和n 1 條邊的乙個有向無環圖。二叉樹 每個節點最多有兩個子樹的樹結構。滿二叉樹 除最後一層無任何子節點外,每一層上的所有結點都有兩個子結點的二叉樹。完全二叉樹 由滿二叉樹而引出 二叉樹的深度為h,除第 h 層外,其它各層 1 h 1 的結點數都達到最大個數 滿二叉 樹 第 h...