(資料結構)堆的實現

2021-08-28 07:30:59 字數 2090 閱讀 8053

堆總是一棵完全二叉樹;且

最大堆總滿足,堆中父節點的值總是大於等於其左右子節點的值;

最小堆總滿足,堆中父節點的值總是小於等於其左右子節點的值。

1.資料儲存

如下圖所示,如果自頂向下,自左向右依次將完全二叉樹中的每個節點標上序號(【注】此處從1開始),並使用陣列儲存(【注】陣列中下標0對應的位置未放置元素),則可以發現規律:如果當前節點的序號為i,則其父節點的序號為i/2,其左孩子節點的序號為2*i,其右孩子節點的序號為2*i+1

2.插入元素時,最大堆的維護(shiftup)

如圖所示,新插入的元素首先放在最後。維護的邏輯為:依次與其父節點比較大小,若大於父節點,則交換二者的值;直到某次比較發現小於等於父節點滿足或已經為根節點。

對於圖中給出的例子,待比較的節點,已使用綠色圓圈表示。

直接給出調整之後的結果圖:

3.取出最大值時,最大堆的維護(shiftdown)

如圖所示,當從最大堆中取出堆頂(即最大)元素後,維護的邏輯為:首先將最後乙個元素放在堆頂位置,然後以堆頂為起點,執行shiftdown。即依次與其左右子節點中較大的乙個較大小,若大於父節點,則交換二者的值;直到某次比較發現大於等於左右子節點滿足或已經為葉子節點。

對於圖中給出的例子,待比較的節點,已使用綠色圓圈表示。

直接給出調整之後的結果圖:

else break; // 符合父節點大於左右子節點

} return;

}public:

maxheap(int capacity) :_capacity(capacity)

~maxheap()

int size()

bool isempty()

void insert(item item)

item extractmax()

void printmaxheap()

std::cout << std::endl;

}};int main()

maxheap.printmaxheap();

maxheap.extractmax();

maxheap.printmaxheap();

maxheap.extractmax();

maxheap.printmaxheap();

return 0;

}此時,堆是基於c++語言,實現(一種抽象資料型別adt)的一整套演算法,是一種資料結構。

ps. 抽象資料型別 vs 資料結構

最後模擬一下vector的實現,體會一下堆:

資料結構 堆的實現

普通的模板引數 template struct less template struct greater template 預設為小堆 class heap heap const t array,size t size int root heap.size 2 1 for root 0 root s...

資料結構 堆(python實現)

資料結構 堆 python實現 用list來儲存堆元素,表尾端加入元素,首段作為堆頂 借鑑裘老師資料結構與演算法的書加上自己的理解 堆 就是乙個完全二叉樹 class heap object def init self,elist self.elems list elist if elist sel...

資料結構 堆的實現(heap)

堆分為兩種 最大堆和最小堆 最大堆 父節點的值比每乙個子節點的值都要大。最小堆,父節點的值比每乙個子節點的值都要小。heap實現 heap.h include include include include include typedef int hpdatatype typedef struct ...