哈夫曼樹及哈夫曼編碼例題

2021-10-21 08:01:18 字數 2013 閱讀 4361

【問題描述】假設用於通訊的電文僅由8個字母組成,字母在電文**現的頻率分別為0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10. 試為這8個字母設計赫夫曼編碼.(要求構造的赫夫曼樹中除葉子節點之外的所有節點的左孩子的節點值小於右孩子的節點值)

【輸入形式】輸入n=8,輸入8個字母;輸入按序8個字母出現的頻率

【輸出形式】輸出編碼後的哈夫曼樹(先序或者完全二叉樹序)

【樣例輸入】

abcdefgh

0.07

0.19

0.02

0.06

0.32

0.03

0.21

0.10

【樣例輸出】

the a 's huffman code is:1010

the b 's huffman code is:00

the c 's huffman code is:10000

the d 's huffman code is:1001

the e 's huffman code is:11

the f 's huffman code is:10001

the g 's huffman code is:01

the h 's huffman code is:1011

#include

#include

#include

#include

using

namespace std;

typedef

struct node *htree;

struct nodehtnode;

typedef

char

**hcode;

void

select

(htree &ht,

int*i,

int*s1,

int*s2)

}*s1=max;

*s2=max;

for(

int j=

1;j<

*i;j++)}

}for

(int j=

1;j<

*i;j++)}

}}void

create

(htree &ht,hcode &hc,

char

*c,double

*w,int n)

for(

; i <= m;

++i,

++p)

for(i = n+

1; i <= m;

++i)

htree h=p;

hc =

(hcode)

malloc

((n+1)

*sizeof

(char*)

);char

*cd =

(char*)

malloc

(n*sizeof

(char))

; cd[n-1]

='\0'

;for

(int i =

1; i <= n;

++i)

else

hc[i]=(

char*)

malloc

((n-start)

*sizeof

(char))

;strcpy

(hc[i]

,&cd[start]);

}free

(cd);}

intmain()

c[0]=

'0';

for(

int i=

1;i<=n;i++

) htree ht;

hcode hc;

create

(ht,hc,c,w,n)

;for

(int i=

1;i<=n;i++

)return0;

}

哈夫曼樹及哈夫曼編碼

哈夫曼樹,最優二叉樹,帶權路徑長度 wpl 最短的樹。它沒有度為1的點,是一棵嚴格的二叉樹 滿二叉樹 了解哈夫曼樹,我們首先要知道樹的幾個相關術語,並了解什麼是wpl。注 樹的wpl這個概念非常重要,這個公式直接產生了哈夫曼編碼資料壓縮的應用 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹...

哈夫曼樹及哈夫曼編碼

給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。樹節點間的邊相關的數叫做權。從樹中的乙個節點到另乙個節點之間的分支構成兩個點之間的路徑,路徑上的分支數目...

哈夫曼編碼 哈夫曼樹

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