二叉堆 完全二叉樹 優先佇列

2021-08-16 20:17:55 字數 1679 閱讀 2248

完全二叉樹的邏輯結構是樹結構, 但由於其特殊性, 資料結構中常用陣列來儲存.

訪問父節點, 左子結點, 右子節點都很方便

陣列儲存以1為起點

假設有某一結點u

a[u/2]為其父節點, 當且僅當u>1

a[u* 2]為其左子結點, 當且僅當u*2 <= n

a[u* 2 +1]為其右子節點, 當且僅當u*2+1 <= n

#include 

using namespace std;

int main()

for(int i = 1; i <= n; ++i) }/*

5781

23*/

二叉堆以完全二叉樹的結構表示

最大堆性質: 結點的鍵值小於等於其父節點的鍵值

最小堆性質: 結點的鍵值大於等於其父節點的鍵值

滿足最大堆性質的二叉堆稱為最大堆

同理最小堆

下面**將乙個普通陣列按最大堆性質更新

/*

建立乙個最大堆

*/#include

#include

using

namespace

std;

#define max 1<<30

int n;

void getchange(int *dui, int i)

}int main()}/*

57 8 1 2 3

*/

以下**建立乙個具有最小堆性質的優先順序佇列

/*

建立乙個最小堆, 獲得以小為優先順序的優先順序佇列

*/#include

#include

using

namespace

std;

int n;

void getchange(int *p, int i)

}int pop(int *p)

int main()

for(int i = n; i >= 1; --i) }/*

57 8 1 2 3

*/

下面**是從無到有建立乙個優先順序佇列, 由插入操作, 彈出優先順序最大操作

/*

從無到有地建立最大堆優先佇列

*/#include

#include

using

namespace

std;

#define max (1<<16)

int n = 0, que[max+1];

void change(int u)

}int pop()

void insert(int x)

}int main()

else

if(str == "extract")

}}/*

insert 8

insert 2

extract

insert 10

extract

insert 11

extract

extract

end*/

二叉堆(完全二叉樹)

最小堆的實現 最小堆是一顆完全二叉樹 這裡用陣列實現完全二叉樹 index 0 1 2 3 4 5 6 value 空 a b c d 任意index,其父親為index 2,左兒子為2 index,右兒子為2 index 1 時間複雜度 o logn include includeusing na...

樹 二叉樹 滿二叉樹 完全二叉樹 堆 概念彙總

樹 乙個擁有n 個節點和n 1 條邊的乙個有向無環圖。二叉樹 每個節點最多有兩個子樹的樹結構。滿二叉樹 除最後一層無任何子節點外,每一層上的所有結點都有兩個子結點的二叉樹。完全二叉樹 由滿二叉樹而引出 二叉樹的深度為h,除第 h 層外,其它各層 1 h 1 的結點數都達到最大個數 滿二叉 樹 第 h...

二叉樹,完全二叉樹,滿二叉樹

二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...