堆 Heap 的實現

2021-09-02 07:39:38 字數 1780 閱讀 6607

什麼是堆?

優先佇列(opriority queue)

特殊的「佇列」,取出元素的順序是依照元素的優先權(關鍵字)大小,而不是元素進入佇列的先後順序。

堆有兩大特性:

1,結構性:是一顆完全二叉樹。

2, 有序性:每個葉子結點到根結點都是有序的,如果是公升序,那麼就是最大堆,否則為最小堆。

這些是堆:

下面的不是堆:

下面讓我們來具體的來看堆是如何建立的

比如給定一組資料:46,25,26,24,10

我們應該如何畫出這個最小堆和最大堆呢?

下面我們先說下最小堆的做法:

第乙個元素46,我們直接插入

第二個元素25,我們和46比較,如果比46大,那麼我們直接插入,否則和46換個位置。

第三個元素26,和它的父親結點23比較,比23大,所以我們直接插入。

第4個元素24,和它的父親結點46比較,比46小,交換

最後乙個元素10,和它的父親結點23比較,比2小,交換,然後和46比較,比46小,交換,但是46比它的兒子結點大,所以找到兒子結點中最小的,然後交換

下面是具體的**實現

05-樹7 堆中的路徑 (25 分)

將一系列給定數字插入乙個初始為空的小頂堆h。隨後對任意給定的下標i,列印從h[i]到根結點的路徑。

每組測試第1行包含2個正整數n和m(≤1000),分別是插入元素的個數、以及需要列印的路徑條數。下一行給出區間[-10000, 10000]內的n個要被插入乙個初始為空的小頂堆的整數。最後一行給出m個下標。

對輸入中給出的每個下標i,在一行中輸出從h[i]到根結點的路徑上的資料。數字間以1個空格分隔,行末不得有多餘空格。

5 346 23 26 24 10

5 4 3

24 23 10

46 23 10

26 10

#include #include using namespace std;

#define max 1001

#define min -1001

int h[max];

int size;

void create()

void insert(int x)

int main()

for ( i = 0; i < m; i++)

cout << endl;

}return 0;

}

堆(Heap)的實現

這次實現了堆,這個堆不是指系統堆疊的堆,是一種資料結構,見下圖 堆的本質就是乙個陣列 上圖中,紅色的是值,黑色的是下標 簡單的來說就是把乙個陣列看成是二叉樹,就像上圖 大堆和小堆分別是指根節點比孩子節點的值大或者是小,看了上圖之後就可以發現,父親節點和孩子節點之間下表的關係,parnet child...

堆(Heap)的實現

這次實現了堆,這個堆不是指系統堆疊的堆,是一種資料結構,見下圖 堆的本質就是乙個陣列 上圖中,紅色的是值,黑色的是下標 簡單的來說就是把乙個陣列看成是二叉樹,就像上圖 大堆和小堆分別是指根節點比孩子節點的值大或者是小,看了上圖之後就可以發現,父親節點和孩子節點之間下表的關係,parnet child...

資料結構 堆的實現(heap)

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