資料結構 哈夫曼樹和哈夫曼編碼

2021-10-07 14:35:29 字數 3013 閱讀 6152

哈夫曼樹即最優二叉樹,指一類帶權路徑長度最短的樹,其中每個結點的帶權路徑長度為,結點到樹根之間的路徑長度與結點權值的乘積。樹的帶權路徑長度即為所有結點之和,寫作:

wpl=σ wili

帶權路徑長度wpl最小的二叉樹即為哈夫曼樹。

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

2、在f中選取兩棵根節點的權值最小的樹作為左、右子樹,構造一棵新的二叉樹,且讓新的二叉樹根節點的權值為左右子樹根節點之和。

3、在f中刪除這兩棵樹,同時將新的二叉樹放到f中。

4、重複2、3條,直到f中只剩下一棵樹。這棵樹就是哈夫曼樹。

乙個有n個葉子結點的初始集合,要生成哈夫曼樹要進行n-1次合併,產生n-1個新結點。最終求得的哈夫曼樹的二叉樹共有2n-1個結點。

#define n 6        

//葉子結點個數

#define m 2n-1

//結點總數

#define eps 1e-5

typedef

char datatype;

typedef

struct

hufmtree;

hufmtree tree[m]

;void

huffmantree

(hufmtree tree)

for(i=

0;i)for

(i=0

;i)else

if(tree[j]

.weight-small2tree[p1]

.parent=i;

tree[p2]

.parent=i;

tree[i]

.lchild=p1;

//i是新生成的子樹 權值為p1p2權值相加

tree[i]

.rchild=p2;

tree[i]

.parent=-1

; tree[i]

.weight=tree[p1]

.weight+tree[p2]

.weight;

}}

讓使用頻率較高的字元和編碼盡可能地短,使傳送電文地總長減少,且任意乙個字元地編碼都不是另乙個字元地編碼地字首(防止混淆)。就可以用二叉樹來設計二進位制地字首碼。約定左分支表示字元0,右分支表示字元1,可以從根節點到葉子結點路徑上分支字元組成地字串作為葉子節點字元的編碼。

設計電文總長最短的二進位制字首碼,就相當於以n種字元出現的頻率做權,構造一棵哈夫曼樹。

從葉子tree[i]出發,利用雙親位址找到雙親結點tree[p] ,再利用tree[p]的lchild和rchild指標域判斷tree[i]是tree[p]的左孩子還是右孩子,決定分配0還是1,接著以tree[p]為出發點繼續向上回潮,直到根節點為止。

typedef

struct

codetype;

codetype code[n]

;void

huffmancode

(codetype code[

],hufmantree tree)

code[i]

=cd;

}}

void

huffmandecode

(codetype code[

], hufmtree tree)

scanf

("%d"

,&b)

;//輸入下乙個二進位制** }if

((tree[i]

.lchild!=0)

&&(i!=m-1)

)printf

("error\n");

//輸入電文有誤

}

例題:假設用於通訊的電文由十種不同的符號組成,在電文**現的頻率為8,21,37,24,6,18,23,41,56,14,試為這十個符號設計相應的哈夫曼編碼

還沒寫完!!**有問題!!看看俺什麼時候來填這個坑(下次一定)

#include

#include

#include

#define n 10

//葉子結點個數

#define m (2*n-1)

//結點總數

#define eps 1000000

typedef

char datatype;

typedef

struct

hufmtree;

hufmtree tree[m]

;typedef

struct

codetype;

codetype code[n]

;void

huffmantree

(hufmtree tree)

for(i=

0;i)for

(i=n;i)else

if(tree[j]

.weight-small2tree[p1]

.parent=i;

tree[p2]

.parent=i;

tree[i]

.lchild=p1;

//i是新生成的子樹 權值為p1p2權值相加

tree[i]

.rchild=p2;

tree[i]

.parent=-1

; tree[i]

.weight=tree[p1]

.weight+tree[p2]

.weight;}}

void

huffmancode

(codetype code[

],hufmtree tree)

code[i]

=cd;

}for

(i=0

;i}int

main()

資料結構 哈夫曼樹 哈夫曼編碼

哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...

哈夫曼編碼 哈夫曼樹 (資料結構)

哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....