資料結構 二叉堆 陣列實現

2021-06-14 05:53:42 字數 1185 閱讀 9346

堆還是比較常用的資料結構

二叉堆也就是以二叉樹形式構造的堆

我們知道二叉樹可以用陣列很方便的實現

所以用陣列實現二叉堆也不是很難的事情

首先我們來了解一下二叉堆的性質:非葉子節點的值均不大於(或不小於)其左右孩子的值

如果用二叉堆用陣列來實現就是n個元素

ki<=k(2*i)&&ki<=k(2*i+1)  或者 ki>=k(2*i)&&ki>=k(2*i+1)    其中(i=1,2,...,n/2);

如此我們就能很方便的在陣列上實現根節點和孩子節點的比較

堆中插入元素,插入元素之後還需要保持堆的性質

堆中取元素的時候一般都是取得堆中最大或者最小的元素

這時我們就可以使用大頂堆來維護取最大值,小頂堆來維護取最小值

堆中取出元素時也需要繼續維護堆的性質

以小頂堆的陣列 實現為例

插入元素:

1.從堆末尾插入元素

2.比較和其父節點元素的大小

2.1.比父節點小,對元素和父節點的元素執行交換操作,

2.2.比父節點大,結束

3.重複2直到根節點

取出最小元素:

1.取出堆的根節點

2.取出堆的最後乙個元素插入到根節點

3.比較根節點和左右孩子的大小

3.1.比左右孩子都大,結束

3.2.只比乙個大,交換根節點元素和孩子節點元素

3.3.比兩個都大,和最小的那個孩子節點交換

4.重複3直到結束,返回1取出的根節點

下面實現乙個小頂堆來維護取最小值。

#include#includeint heap[1000];//定義堆的大小

int end=0;//指向堆中的最後乙個元素並且標記元素的個數

void insert(int a)

break;

}if(heap[rt]<=heap[ls]&&heap[rt]<=heap[rs])break;//左孩子右孩子都比根節點大,不需要交換

if(heap[rt]>heap[ls]&&heap[rs]>=heap[ls])else

}return res;

}int main()

printf("\n");

while(end>0)

printf("\n");

return 0;

}

資料結構 二叉堆

二叉堆一般用來實現優先佇列 優先佇列是一種至少允許以下兩種操作的資料結構 insert 以及 deletemin 同查詢樹一樣,二叉堆具有結構性與堆序性,對二叉堆的基本操作可能會破壞這些性質,所以二叉堆的操作要直到其基本性質滿足才能結束。一 結構性 二叉堆在結構上為完全二叉樹,其具有完全二叉樹的結構...

資料結構 二叉堆

二叉堆 優先佇列 具有結構性和堆序性 結構性為 二叉堆是一棵完全被填滿的二叉樹,有可能的例外是在底層,底層上的元素從左到右填入。這樣的樹稱為完全二叉樹。二叉堆可以用陣列表示,對於陣列中任意位置i上的元素,其左兒子在位置2i上,右兒子在位置2i 1上,父親則在i 2上 小於i 2的最小整數 堆序性為 ...

資料結構 二叉堆

二叉堆其實就是二叉樹,只不過二叉堆的最頂端的值,要麼最大,要麼最小,這要根據題意來定。如圖 讀者注意一下,圖上的黑字代表二叉堆的值,而紅色則代表下表。二叉堆的基本操作 插入,刪除和查詢。堆的stl實現 本人不太懂,就參考這位大佬的 上圖中,q.top 就是查詢,q.pop 就是刪除,q.push 就...