哈弗曼編碼

2021-07-11 15:58:41 字數 1174 閱讀 8446

定義:

它是由n個帶權葉子結點構成的所有二叉樹中帶權路徑長度最短的二叉樹。因為這種樹最早由哈夫曼(huffman)研究,所以稱為哈夫曼樹,又叫最優二叉樹。

1.初始化:

根據給定的n個權值構成n棵二叉樹的集合f=,其中每棵二叉樹ti中只有乙個帶權wi的根結點,左右子樹均空。

2. 找最小樹:

在f中選擇兩棵根結點權值最小的樹作為左右子樹構造一棵新的二叉樹,且至新的二叉樹的根結點的權值為其左右子樹上根結點的權值之和。

3. 刪除與加入:

在f中刪除這兩棵樹,並將新的二叉樹加入f中。

4. 判斷:

重複前兩步(2和3),直到f中只含有一棵樹為止。該樹即為哈夫曼樹

**實現:

由於本身節點的特殊性(同時要記錄雙親節點和孩子節點)所以這裡採用靜態鍊錶來實現構造

typedef

struct

htnode;

構造哈弗曼樹:

void createht(htnode ht, int n)

else

if (ht[k].weight < min2)

}ht[i].weight = ht[rnode].weight + ht[lnode].weight;//將合併後的雙親節點依次放在陣列末端並記錄孩子節點

ht[i].lch = lnode;

ht[i].rch = rnode;

ht[lnode].parent = i;//標記雙親節點下標

ht[rnode].parent = i;}}

構造哈弗曼編碼節點:

typedef

struct

hcode;

哈弗曼編碼:

void createhcode(htnode ht, hcode hcd, int n)

hc.start++;//start指向編碼開始下標

hcd[i] = hc;//存放編碼}}

哈弗曼編碼 哈弗曼樹

哈弗曼編碼是依賴於字元使用頻率來建立的一種編碼,通過把使用頻率低的字元分配相對較多的01編碼,而使用頻率高的分配相對較低的01編碼,來建立最小的帶權路徑長度的樹,來最大化的獲得編碼儲存空間的一種編碼規則。這個樹稱為哈弗曼樹,也稱為最優二叉樹。這樣可以確定每乙個字元的編碼不可能成為其他字元編碼的坐子串...

哈弗曼編碼

include include include define my strmax 100 define infinity 1000000 typedef struct htnode,huffmantree 動態分配陣列儲存赫夫曼樹 typedef char huffmancode 動態分配陣列儲存赫...

哈弗曼編碼

include iostream include queue include vector include string using namespace std struct huffmantree bool operator const huffmantree t const vector h 相...