一、相關概念
1、葉子結點的權值(weight)是對葉子結點賦予的乙個有意義的數值量。
2、設二叉樹有n個帶權值的葉子結點,從根節點到各個葉子結點的路徑長度與相應葉子結點權值的乘積之和叫做二叉樹的帶權路徑長度。
3、給定一組具有確定權值的葉子結點,可以構造出不同的二叉樹,將其中帶權路徑長度最小的二叉樹稱為哈夫曼樹。
二、哈夫曼演算法基本思想
(1) 以權值分別為w1,w2...wn的n各結點,構成n棵二叉樹t1,t2,...tn並組成森林f=,其中每棵二叉樹 ti僅有乙個權值為 wi的根結點;
(2) 在f中選取兩棵根結點權值最小的樹作為左右子樹構造一棵新二叉樹,並且置新二叉樹根結點權值為左右子樹上根結點的權值之和(根結點的權值=左右孩子權值之和,葉結點的權值= wi);
(3) 從f中刪除這兩棵二叉樹,同時將新二叉樹加入到f中;
(4) 重複(2)、(3)直到f中只含一棵二叉樹為止,這棵二叉樹就是huffman樹。
三、哈夫曼演算法的儲存結構
考慮到對於有n個葉子結點的哈夫曼樹有2n-1個結點,並且進行n-1次合併操作,為了便於選取根節點權值最小的二叉樹以及合併操作,設定乙個陣列haftree[2n-1],儲存哈夫曼樹中的各個結點的資訊,陣列元素的結點結構如下圖所示:
weight
lchild
rchild
parent
哈夫曼樹的結點結構
其中,weight儲存結點權值;
lchild儲存該節點的左孩子在陣列中的下標;
rchild儲存該節點的右孩子在陣列中的下標;
parent儲存該節點的雙親孩子在陣列中的下標。
可以用c++語言中的結構體型別定義上述結點,如下:
1四、哈夫曼演算法c++實現為了判定乙個結點是否已經加入哈夫曼樹中,可通過parent域的值來確定。初始時parent的值為-1,當某結點加入到樹中時,該節點parent域的值為其雙親結點在陣列中的下標。//哈夫曼樹的結點結構
2struct
element
3;
構造哈夫曼樹時,首先將n個權值的葉子結點存放到陣列haftree的前n個分量中,然後不斷將兩棵子樹合併為一棵子樹,並將新子樹的根節點順序存放到陣列haftree的前n個分量的後面。
哈夫曼演算法用偽**描述為:
1、陣列haftree初始化,所有陣列元素的雙親、左右孩子都置為-1;哈夫曼演算法完整**描述如下;2、陣列haftree的前n個元素的權值置給定權值;
3、進行n-1次合併
3.1 在二叉樹集合中選取兩個權值最小的根節點,其下標分別為i1,i2;
3.2 將二叉樹i1、i2合併為一棵新的二叉樹k。
1 #include2 #include //最後的輸出結果為:這個標頭檔案是宣告一些 「流操作符」的3//
比較常用的有:setw(int);
//設定顯示寬度,left
//right
//設定左右對齊。 setprecision(int);
//設定浮點數的精確度。
4using
namespace
std;5//
哈夫曼樹的結點結構
6struct
element7;
11//
選取權值最小的兩個結點
12void selectmin(element a,int n, int &s1, int &s2)
1321}22
for (int i = 0; i < n; i++)//
s1為權值最小的下標
2327
for (int j = 0; j < n; j++)
2834}35
for (int j = 0; j < n; j++)//
s2為另乙個權值最小的結點
3640}41
//哈夫曼演算法
42//
n個葉子結點的權值儲存在陣列w中
43void huffmantree(element huftree, int w, int
n)44
51for (int i = 0; i < n; i++) //
構造只有根節點的n棵二叉樹
5255
for (int k = n; k < 2 * n - 1; k++) //
n-1次合併
566667}
// 列印哈夫曼樹
68void print(element ht,int
n)6980}
81int
main()
82; //
權值集合
84 element *hufftree=new element[2*8-1]; //
動態建立陣列
85 huffmantree(hufftree, x, 8
);86 print(hufftree,15
);87 system("
pause");
88return0;
89 }
[1]王紅梅, 胡明, 王濤. 資料結構(c++版)[m]. 北京:清華大學出版社。
2018-01-03
C 哈夫曼樹及哈夫曼編碼的實現
huffmancode.h ifndef huffmancode h define huffmancode h include typedef struct htnode,huffmantree typedef char huffmancode void huffmancoding huffmant...
哈夫曼樹及哈夫曼編碼 C
說明 1.讀取檔案中需進行哈夫曼編碼的資料資訊 2.構造生成單節點二叉樹組 森林 3.構造哈夫曼樹 4.進行哈夫曼編碼 5.輸出對應資料及其編碼 include include includeusing namespace std const int max n 100 最大容量 const int...
哈夫曼樹及哈夫曼編碼
哈夫曼樹,最優二叉樹,帶權路徑長度 wpl 最短的樹。它沒有度為1的點,是一棵嚴格的二叉樹 滿二叉樹 了解哈夫曼樹,我們首先要知道樹的幾個相關術語,並了解什麼是wpl。注 樹的wpl這個概念非常重要,這個公式直接產生了哈夫曼編碼資料壓縮的應用 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹...