本文為浙大版《資料結構》學習筆記。
堆(heap)又稱為優先佇列,佇列中元素的進出依據先進先出的原則,而在堆中,取出元素時依照元素優先順序的大小。
堆最常用的結構是用二叉樹表示,通常是用完全二叉樹,由於完全二叉樹中結點排布極其規律,因而可直接用陣列實現其儲存。
由此,堆有兩個特性:
1.結構特性:用陣列表示完全二叉樹;
2.部分有序性:任一結點元素的數值與其子結點所儲存的值是相關的。
有兩種基本堆:最小堆(minheap)和最大堆(maxheap)。在前者中,任一結點的值大於或等於其子結點的值;在後者中,任一結點的值小於或等於其子結點的值。
這裡僅以最大堆的操作為例。
1.堆的結構定義
struct heap
;typedef heap maxheap;
typedef heap minheap;
2.初始化堆
/*初始化堆*/
maxheap *
initiateheap
(int maxsize)
3.判斷堆滿
/*判斷堆滿*/
bool
isfull
(maxheap *h)
4.判斷堆空
/*判斷堆空*/
bool
isempty
(maxheap *h)
5.在堆中插入元素x
/*在最大堆中插入x*/
void
insert
(maxheap *h,elementtype x)
i=++h-
>size;
//i指向新增元素的位置
for(
;h->data[i/2]
) h-
>data[i]
=h->data[i/2]
;//將元素x插入的位置上移
h->data[i]
=x;}
6.取出鍵值為最大的元素,並刪除乙個結點
/*取出鍵值為最大的元素,並刪除乙個結點*/
elementtype deletemax
(maxheap *h)
maxitem=h-
>data[1]
; x=h-
>data[h-
>size--];
for(parent=
1;parent*
2<=h-
>size;parent=child)
h->data[parent]
=x;return
(maxitem)
;}
7.將已有堆調整成最大堆:1.先保證結構特性(完全二叉樹);2.再調整有序性
/*將已有堆調整成最大堆:1.先保證結構特性(完全二叉樹);2.再調整有序性*/
void
buildheap
(maxheap *h)
percdown()函式
/*將h中以h->data[p]為根的子堆調整為最大堆*/
void
percdown
(maxheap *h,
int p)
h->data[parent]
=x;}
乙個可執行的完整程式:根據輸入的元素建立乙個最大堆,再插入數值58,再刪除堆中最大的元素,最後列印出堆中的所有元素。
#include
#define maxdate 100
#define error -1;
using
namespace std;
typedef
int elementtype;
struct heap
;typedef heap maxheap;
typedef heap minheap;
intmain()
buildheap
(h);
insert
(h,58);
deletemax
(h);
int i;
for(i=
1;i<=h-
>size;i++
) cout<
>data[i]
<<
' ';
cout<
return0;
}/*初始化堆*/
maxheap *
initiateheap
(int maxsize)
/*判斷堆滿*/
bool
isfull
(maxheap *h)
/*判斷堆空*/
bool
isempty
(maxheap *h)
/*在最大堆中插入x*/
void
insert
(maxheap *h,elementtype x)
i=++h-
>size;
//i指向新增元素的位置
for(
;h->data[i/2]
) h-
>data[i]
=h->data[i/2]
;//將元素x插入的位置上移
h->data[i]
=x;}
/*取出鍵值為最大的元素,並刪除乙個結點*/
elementtype deletemax
(maxheap *h)
maxitem=h-
>data[1]
; x=h-
>data[h-
>size--];
for(parent=
1;parent*
2<=h-
>size;parent=child)
h->data[parent]
=x;return
(maxitem);}
/*將h中以h->data[p]為根的子堆調整為最大堆*/
void
percdown
(maxheap *h,
int p)
h->data[parent]
=x;}
/*將已有堆調整成最大堆:1.先保證結構特性(完全二叉樹);2.再調整有序性*/
void
buildheap
(maxheap *h)
執行結果(紅框內為輸出):
二叉樹應用 堆
本例中實現了最小堆的構造 插入 刪除。最小堆表示乙個非終端節點均不大於其左右孩子節點。最小堆用完全二叉樹表示,但是二叉樹存入一維陣列中。將完全二叉樹存入陣列,有一些性質。先將二叉樹從上到下,從左到右給每個節點編號0,1.n。那個乙個節點編號i,他的左孩子編號為2 i 1,右孩子編號2 i 2。完全二...
二叉樹及其應用
實驗內容 假設自上而下按層次,自左至右輸入每個結點的乙個三元組 n,p,l r 其中n為本結點的元素,p為其父結點,l指示n為p 的左孩子,r指示n為p的右孩子。試寫乙個建立二元樹在記憶體的雙鏈表示演算法,並實現先根 中根 後根以及層序遍歷演算法。樣例輸出 二選一 a 1 1 balgar cbld...
二叉樹及其應用 二叉樹遍歷
給定二叉樹的廣義表表示,構造二叉樹並輸出二叉樹的四種遍歷順序。輸入說明 輸入僅一行,該行僅由 以及大小寫字元構成的二叉樹的廣義表表示,字串長度不超過100。輸出說明 在接下來的四行中依行輸出二叉樹的四種遍歷 輸入樣列 a b d,c e,f h 輸出樣列 abdcefh dbaecfh dbehfc...