儲存結構:堆中元素在陣列中是按照完全二叉樹層序儲存的。陣列起始結點為1。
下標特點:對於下標為i的結點,i/2為父節點,左右子結點分別為2i和2i+1。
最大堆特點:任一結點的值大於或者等於其子結點的值。
最小堆特點:任一結點的值小於或者等於其子結點的值。
#include
#include
#define maxdata 1000
typedef
struct hnode
*maxheap,minheap;
maxheap createheap
(int maxsize)
bool
isfull
(maxheap h)
bool
insert
(maxheap h,
int x)
i =++h-
>size;
for(
; h-
>data[i /2]
< x; i /=2
) h-
>data[i]
= x;
return
true;}
bool
isempty
(maxheap h)
intdeletemax
(maxheap h)
maxitem = h-
>data[1]
; x = h-
>data[h-
>size--];
for(parent =
1; parent *
2<= h-
>size; parent = child)
if(x >= h-
>data[child]
)break
;else
h->data[parent]
= h-
>data[child];}
h->data[parent]
= x;
return maxitem;
}int
main()
typedef
struct hnode
*maxheap,minheap;
maxheap createheap
(int maxsize)
最大堆插入元素後依然要保持完全二叉樹的性質。插入結點按照序號插入。
最大堆插入方式:由於最大堆從根節點到任何葉結點的路徑是遞降的有序數列,因此插入的方式是用插入結點和父結點比較大小,如果插入結點大則互換位置,反之則插入。
最大堆的刪除:取出根結點的最大元素值,同時刪除乙個結點(陣列中最後乙個單元即堆中的最後乙個結點)
哈夫曼樹構造(不唯一)
1.確定有n個權值的集合構造n棵單結點二叉樹。
2.選擇兩個最小的結點作為左右子樹,兩個結點的權值和作為父節點3.將整棵樹放入集合中,尋找集合中最小的結點和這個樹的父節點作為左右子樹,和作為父節點。
4.重複2,3的步驟直到集合為空。
經典資料結構之最大堆
最大堆和最小堆是常用的優先佇列。其概念也比較簡單,用樹的方式描述,就是,父節點比子節點大 最大堆 小則為最小堆。最大堆和最小堆廣泛用在有先後順序的任務排程中。比如cpu的任務排程等。先上 後面再詳細解釋和補充我的看法。標頭檔案 ifndef cbinarytree h included define...
資料結構 最大堆排序 python實現
二叉 堆資料結構是一種陣列物件。可以被視為一棵完全二叉樹。數中每個節點與陣列中存放該節點值的那個元素對應。樹的每一層都是填滿的。最後一層可能除外 最後一層從乙個節點的左子樹開始填 引用自 演算法導論 再抄一遍複習一下 從無序的陣列構建乙個完整的堆,最好及最壞的情況下,建立堆時間複雜度均為o nlgn...
資料結構之java實現的最大堆
二叉堆是乙個完全二叉樹,區別於滿二叉樹。當二叉堆的任意結點的值不大於其父親結點的值,那麼這個堆就是最大堆。最大堆是堆的兩種形式之一。根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆 大頂堆 大根堆要求根節點的關鍵字既大於或等於左子樹的關鍵字值,又大於或等於右子樹的關鍵...