C 二叉樹的應用(一) 堆及其操作

2021-10-03 00:23:23 字數 3450 閱讀 7597

本文為浙大版《資料結構》學習筆記。

堆(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...