什麼是堆?
優先佇列(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 ...