堆的實現(堆的建立及push pop元素)

2021-07-13 08:54:32 字數 2064 閱讀 8841

堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹結構。

堆結構的二叉樹儲存:

大堆:每個父節點的都大於孩子節點;小堆:每個父節點的都小於孩子節點。

建堆:由於堆被視為完全二叉樹,故在h-1層找到第乙個(從後往前找)非葉子結點,進行堆的下調

建大堆時,從下往上依次判斷並調整堆,使該結點的左右子樹都滿足大堆

建小堆時,從下往上依次判斷並調整堆,使該結點的左右子樹都滿足小堆

可見大堆的建立與小堆的建立方式類似,下面以大堆進行討論。

利用vactor模板儲存堆中元素

templateclass heap

;

實現堆的建立

templateheap::heap()

:_a(null)

{}templateheap::heap(const t* a, size_t size)

堆的第乙個非葉子結點的陣列下標時((size-1)-1)/2(最後乙個結點是size-1)

for (int i = (int)(size - 2) / 2; i >= 0; --i)//不能定義為size_t(無符號)

//建小堆,類似建大堆的方式,從下向上進行調整堆,使該結點處的左右子樹都滿足小堆

//在進行調小堆時,也通過下調實現

}//下調--建大堆/小堆

templatevoid heap::_adjustdown(size_t parent)

if (_a[child] > _a[parent])//如果子結點大於父親結點就交換,否則就要跳出迴圈

else

}}//在建立小堆時,只需要將比較條件進行改變就可以實現

在已經是大堆或小堆的堆中加入元素使堆仍為大堆,可通過該元素與它的父結點進行比較

ps:由於插入的元素在陣列末尾,故需要通過上調進行比較實現堆的大堆或小堆

templatevoid heap::_adjustup(size_t child)//上調

else

}}templatevoid heap::push(const t& x)//元素x入堆

堆中pop元素,刪除堆頂元素,使堆仍為大堆。

在已經是大堆或小堆的堆中刪除堆頂元素,直接刪除堆頂元素,造成無法進行大堆或小堆的實現,可通過將第乙個元素與最後乙個元素進行交換,然後刪除最後乙個元素,最後通過下調實現大堆或小堆

templatevoid heap::pop()//出堆

實現堆的堆頂,判空及堆元素個數

templatet& heap::gettop()//訪問堆頂元素

templatebool heap::empty()//判空

templatesize_t heap::size()//堆元素個數

templatevoid heap::printheap()

cout << endl;

}

測試用例

#include"heap.hpp"

void test4()

; heaph(arr, sizeof(arr) / sizeof(arr[0]));

h.printheap();

cout << "empty: " << h.empty() << endl;

cout << "size: " << h.size() << endl;

cout << "gettop: " << h.gettop() << endl;

h.push(20);

h.printheap();

h.pop();

h.printheap();

}

如果對於上述說明還是不是很清楚,可自己親手畫圖分析,存在不足之處請多多指教。

【vector】包含著一系列連續儲存的元素, 其行為和陣列類似。訪問vector中的任意元素或從末尾新增元素都可以在常量級時間複雜度內完成,而查詢特定值的元素所處的位置或是在vector中插入元素則是線性時間複雜度。

本文出自 「scen」 部落格,請務必保留此出處

小頂堆及大頂堆的建立

首先明確堆是乙個完全二叉樹,小頂堆指根結點的值小於或等於左右子節點的值,大頂堆指根結點的值都大於或等於左右子節點的值 關於大小頂堆的建立更詳細的介紹 include include include include include include include include using names...

堆的實現及用途

大頂堆 每個結點的值都大於或等於其左右孩子結點的值。小頂堆 每個結點的值都小於或等於其左右孩子結點的值。注 本節以小頂堆為例,記堆的大小為n。首先定義乙個堆。class heap void push int x void pop int top int size bool empty 從當前結點開始...

堆的建立及基礎操作

建立乙個堆 void creatheap heap hp,int array,int size hp capacity size 搬移 for i i size size hp size size 找數的倒數第乙個非葉子結點 int last size 2 1 最後乙個結點是size 1,雙親就是再...