葉子結點的權值:對葉子結點賦予的乙個有意義的數值量。
二叉樹的帶權路徑長度:設二叉樹具有n個帶權值的葉子結點,從根結點到各個葉子結點的路徑長度與相應葉子結點權值的乘積之和。
給定一組確定權值的葉子結點,帶權路徑長度最小的二叉樹
n個結點權值w1,w2,…,wn
第一步:將這n個結點分別作為僅含乙個結點的二叉樹,構成森林f。
第一步:構造乙個新結點,從f中選取兩顆權值最小的樹作為新結點的左右子樹,並且將新結點的權值置為其左右子樹上根結點的權值之和。
第三步:從f中刪除剛才選出的兩棵樹,同時將新得到的樹加入f中。
權值越大的葉子結點越靠近根結點,而權值越小的葉子結點越遠離根結點。
構造過程中共新建了n-1個結點,哈夫曼樹結點總數為n+n-1=2n-1
只有度為0(葉子結點)和度為2(分支結點)結點,不存在度為1的結點(每次構造都選擇兩棵樹作為新結點的孩子,故不可能存在度為1的結點)
特點二另一種理解:
在特點三的基礎上結合二叉樹的性質(非空二叉樹上的葉子結點數等於度為2的結點數加1,即n0=n2+1)
哈夫曼樹的總結點樹n=n0+n2=n0+n0-1=2n0-1
即為哈夫曼樹特點2
3個結點權值(2,4,1),構建哈夫曼樹
//初始化前n個結點的權值
for(i=
0;i) hufftree[i]
.weight=w[i]
;for
(i=n;i<
2*n-
1;i++)}
intmain()
system
("pause>nul");
return0;
}執行截圖(數字是下標,-1代表沒有)
學習筆記 C 資料結構 哈夫曼樹,哈夫曼編碼
今天把哈夫曼樹又實現了一遍。主要使用了c 的stl的priority queue優先佇列實現哈夫曼樹的構建。優先佇列的底層其實是小頂堆 或大頂堆 哈夫曼樹的構建用到的是小頂堆啦,因為每次都是從優先佇列中彈出最小的兩個元素,也就是小頂堆頂的兩個元素。優先佇列的語法是這樣的 include includ...
資料結構筆記 哈夫曼樹
目錄 一 帶權路徑長度 二 哈夫曼樹的定義 三 哈夫曼樹的構造 四 哈夫曼編碼 五 總結 結點的權 有某種現實含義的數值 如 表示結點的重要性等 結點的帶權路徑長度 從樹的根到該結點的路徑長度 經過的邊數 與該結點上權值的乘積 樹的帶權路徑長度 樹中所有葉子結點的帶權路徑長度之和 在含有n個帶權葉結...
哈夫曼樹演算法(資料結構C 描述)
哈夫曼樹演算法 includeusing namespace std const int n 5 const int m 2 n 1 const int float max 20 typedef int datatype typedef struct nodetype 結點型別 typedef no...