資料結構 哈弗曼樹

2021-10-04 19:22:28 字數 1685 閱讀 6122

哈夫曼樹應用例項——哈夫曼編碼

關鍵:要設計長度不等的編碼,則必須使任一位元組的編碼都不是另一字元的編碼的字首–字首編碼。

解碼過程

分解接收字串,遇「0」向左,遇「1」向右,一旦達到葉子結點,則譯出乙個字元,反覆由根出發,直到解碼完成。

特點:每一碼都不是另一碼的字首,絕不會譯錯。

哈弗曼樹的構造

哈弗曼樹:帶權路徑長度最小的樹。

:由一結點到另一結點間的分支所構成

路徑長度:路徑上的分支數目

帶權路徑長度:結點到根的路徑長度與結點上權的乘積

樹的帶權路徑長度:樹中所有葉子結點的帶權路徑長度之和

哈弗曼樹的構造過程

基本思想:使權大的結點靠近根。

操作要點:對權值的合併、刪除與替換,總是合併當前值最小的兩個。

哈夫曼編碼的構造

基本思想:概率大的字元用短碼,小的用長碼,構造哈弗曼樹。

構造過程

①根據給定的n個權值,構造n棵只有根結點的二叉樹。

②在森林中選取兩棵根結點權值最小的樹作左右子樹,構造一棵新的二叉樹,置新二叉樹根結點權值為其左右子樹根結點權值之和。

③在森林中刪除這兩棵樹,同時將新得到的二叉樹加入森林中。

④重複上述兩步,直到只含一棵樹為止,這棵樹即哈弗曼樹。

哈弗曼樹構造演算法的實現

typedef

struct

*huffmantree;

huffman樹的建立
//演算法5.8 建立huffman樹

void

createhuffmantree

(huffmantree &ht,

int n)

}

huffman編碼
//演算法5.9 構造並輸出huffman編碼

void

createhuffmancode

(huffmantree &ht,huffmancode &hc,

int n)

hc[i]

=new

char

[n-start]

;strcpy

(hc[i]

,&cd[start]);

}for

(int i=

1;i<=n;i++

)}

哈夫曼編碼的幾點結論

● 哈夫曼編碼是不等長編碼。

● 哈夫曼編碼是字首編碼,即任一字元的編碼都不是另一字元編碼的字首。

● 哈夫曼編碼樹中沒有度為1的結點。若葉子結點的個數為n,則哈夫曼編碼樹的結點總數為2n-1。

● 傳送過程:根據由哈夫曼樹得到的編碼表送出字元資料。

● 接收過程:按左0、右1的規定,從根結點走到乙個葉結點,完成乙個字元的解碼。反覆此過程,直到接收資料結束。

應用

● 利用二叉樹求解表示式的值

資料結構 哈弗曼樹

code for fun created by dream whui 2015 2 8 include stdafx.h include using namespace std typedef struct 定義哈弗曼樹的結構 htnode,huffmantree typedef char huff...

資料結構哈弗曼樹

include using namespace std define maxvalue 1000 define n 100 typedef struct hnodetype typedef structhcodetype n為葉子節點的個數 void menu void create haffman...

資料結構之哈弗曼樹與哈弗曼編碼

一.哈弗曼樹和哈弗曼編碼先知 哈弗曼樹是二叉樹中一種特殊的樹,也被稱為最優二叉樹。其通過某種規則 權值 來構造出一哈夫曼二叉樹,在這個二叉樹中,只有葉子節點才是有效的資料節點,其他的非葉子節點是為了構造出哈夫曼而引入的!哈夫曼編碼是通過哈夫曼樹進行的一種編碼,一般情況下,以字元 0 與 1 表示。編...