完全二叉樹的邏輯結構是樹結構, 但由於其特殊性, 資料結構中常用陣列來儲存.
訪問父節點, 左子結點, 右子節點都很方便
陣列儲存以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個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...