題目描述
假設某通訊報文的字符集由a,b,c,d,e,f這6個字元組成,它們在報文**現的頻度(頻度均為整數值)。
(1)構造一棵哈弗曼樹,依次給出各字元編碼結果。
(2)給字串進行編碼。
(3)給編碼串進行解碼。
規定:構建哈弗曼樹時:左子樹根結點權值小於等於右子樹根結點權值。
生成編碼時:左分支標0,右分支標1。
輸入第一行:依次輸入6個整數,依次代表a,b,c,d,e,f的頻度,用空格隔開。
第二行:待編碼的字串
第三行:待解碼的編碼串
輸出前6行依次輸出各個字元及其對應編碼,格式為【字元:編碼】(冒號均為英文符號)
第7行:編碼串
第8行:解碼串
樣例輸入 copy
3 4 10 8 6 5
bee0010000100111101
樣例輸出 copy
a:000
b:001
c:10
d:01
e:111
f:110
001111111
badbed
#include
#include
#include
#define n 6
#define m 2*n-1
#define maxint 32767
#define ch 30
#define num 100
typedef
struct
htnode,huffmantree[m]
;typedef
char
* huffmancode[n]
;void
select
(huffmantree ht,
int pos,
int*s1,
int*s2)
else
if(ht[j]
.weight.parent==-1
)}}void
crthuffmantree
(huffmantree ht,
int w,
int n)
for(i = n;i < m;i++
)for
(i = n;i < m;i++)}
void
crthuffmancode
(huffmantree ht,huffmancode hc ,
int n)
else
c = p;
p = ht[p]
.parent;
} hc[i]=(
char*)
malloc
((n - start)
*sizeof
(char))
;strcpy
(hc[i]
,&cd[start]);
}free
(cd);}
void
printcode
(char s[
],huffmancode hc)
}void
alphagetnum
(char charcode,
char s[
],huffmancode hc)
} p++;}
}void
numgetalpha
(char charnum[
],huffmantree ht,
char s)
p++;}
printf
("%c\n"
,s[key]);
}}intmain()
;printf
("please enter weights:");
for( i =
0;i < n;i++
)printf
("please enter the code:");
scanf
("%s"
, charcode)
;printf
("please enter the password:");
scanf
("%s"
,charnum)
;crthuffmantree
(ht,w,6)
;//建立哈夫曼樹
crthuffmancode
(ht,hc,6)
;//哈夫曼編碼,將每個字元得權值編成哈夫曼編碼
printcode
(s, hc)
;//將每個字元的哈夫曼編碼輸出
alphagetnum
(charcode,s,hc)
;//字元得到密碼
printf
("\n");
numgetalpha
(charnum,ht,s)
;//密碼得到字元
}
哈夫曼樹建立和哈夫曼碼生成
直接上 htree.h typedef struct htreenode htreenode main.cpp include include include include htree.h htreenode inithtree int num 初始化哈夫曼樹結點 void getmin htre...
哈夫曼樹的建立和編碼
演算法思路 以權值分別為w1,w2 的 各結點,構成n棵二叉樹t1,t2,tn並組成森林f 其中每棵二叉樹 ti僅有乙個權值為 wi的根結點 2 在f中選取兩棵根結點權值最小的樹作為左右子樹構造一棵新二叉樹,並且置新二叉樹根結點權值為左右子樹上根結點的權值之和 根結點的權值 左右孩子權值之和,葉結點...
c 哈夫曼樹的建立 編碼 解碼
哈夫曼樹的建立和編碼 include includeusing namespace std typedef struct hthtnode,huffmantree typedef char huffmancode void select huffmantree ht,int k,int s1,int...