假設某通訊報文的字符集由a,b,c,d,e,f這6個字元組成,它們在報文**現的頻度(頻度均為整數值)。
(1)構造一棵哈弗曼樹,依次給出各字元編碼結果。
(2)給字串進行編碼。
(3)給編碼串進行解碼。
構建哈弗曼樹時:左子樹根結點權值小於等於右子樹根結點權值。
生成編碼時:左分支標0,右分支標1。
第一行:依次輸入6個整數,依次代表a,b,c,d,e,f的頻度,用空格隔開。
第二行:待編碼的字串
第三行:待解碼的編碼串
前6行依次輸出各個字元及其對應編碼,格式為【字元:編碼】(冒號均為英文符號)
第7行:編碼串
第8行:解碼串
3 4 10 8 6 5
bee0010000100111101
a:000
b:001
c:10
d:01
e:111
f:110
001111111
badbed
//
// created by haoren on 2019/11/6.
//#include
#include
#include
#define n 100
#define m 2*n-1
//哈夫曼樹結構
typedef
struct nodehtnode, huffmantree[m+1]
;//編碼結構
typedef
char
* huffmancode[n+1]
;//找最小,次小函式
void
select
(huffmantree ht,
int n,
int*s1,
int*s2)
}for
(int i =
1; i <= n; i++)}
*s1 = temp;
for(
int i =
1; i <= n; i++)}
for(
int i =
1; i <= n; i++)}
*s2 = temp;
}//建立哈夫曼樹
void
crthuffmantree
(huffmantree ht,
int w,
int n)
for(
int i = n+
1; i <= m; i++
)for
(int i = n+
1; i <= m; i++)}
//哈夫曼編碼
void
crthuffmancode
(huffmantree ht, huffmancode hc,
int n)
hc[i]=(
char*)
malloc
((n-start)
*sizeof
(char))
;strcpy
(hc[i]
,&cd[start]);
}free
(cd);}
//哈夫曼解碼
void decode (huffmantree ht,
char ch)
}}intmain
(void
)char ch[10]
;//編碼時輸入字串
char ch1[
100]
;//解碼時輸入字串
scanf
("%s"
, ch)
;scanf
("%s"
, ch1)
;crthuffmantree
(hfmtree, w,6)
; huffmancode hfmcode;
crthuffmancode
(hfmtree, hfmcode,6)
;for
(int i =
1; i <=
6; i++
)for
(int i =
0; i <
strlen
(ch)
; i++
)printf
("\n");
decode
(hfmtree, ch1)
;return0;
}
給定權值求哈弗曼樹
include include using namespace std define maxsize 10 typedef int elemtype typedef struct btreenode btreenode 根據陣列 a 中 n 個權值建立一棵哈夫曼樹,返回樹根指標 btreenode ...
哈弗曼編碼 哈弗曼樹
哈弗曼編碼是依賴於字元使用頻率來建立的一種編碼,通過把使用頻率低的字元分配相對較多的01編碼,而使用頻率高的分配相對較低的01編碼,來建立最小的帶權路徑長度的樹,來最大化的獲得編碼儲存空間的一種編碼規則。這個樹稱為哈弗曼樹,也稱為最優二叉樹。這樣可以確定每乙個字元的編碼不可能成為其他字元編碼的坐子串...
哈弗曼編碼
include include include define my strmax 100 define infinity 1000000 typedef struct htnode,huffmantree 動態分配陣列儲存赫夫曼樹 typedef char huffmancode 動態分配陣列儲存赫...