给定权值,哈弗曼编码、译码
-
题目描述
假设某通信报文的字符集由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
BEE
0010000100111101
样例输出
A:000
B:001
C:10
D:01
E:111
F:110
001111111
BADBED -
我的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
#define M 2*N-1
typedef struct Node{
int weight;
int parent;
int Left;
int Right;
}HTNode,HuffmanTree[M+1];
void select(HuffmanTree T,int* min1,int *min2,int n){
*min1;
*min2;
for(int i = 1;i<=n;i++){
if(T[i].parent==0){
*min1 = i;
}
}
for(int i = 1;i<=n;i++){
if(T[*min1].weight> T[i].weight&&T[i].parent==0){
*min1 = i;
}
}
for(int i = 1;i<=n;i++){
if(i!=*min1&&T[i].parent==0){
*min2 = i;
}
}
for(int i = 2;i<=n;i++){
if(T[*min2].weight> T[i].weight&&i!=*min1&&T[i].parent==0){
*min2 = i;
}
}
// printf("%d %d\n",*min1,*min2);
}
void CtHuffmanTree(HuffmanTree T,int* treeWeight,int n){
int i,j;
int min1,min2;
int m = 2*n-1;
//初始化一个哈夫曼树
for(i = 1;i<=n;i++){
T[i].weight = treeWeight[i];
T[i].parent = 0;
T[i].Left = 0;
T[i].Right = 0;
}
for(i = n+1;i<=m;i++){
T[i].weight = 0;
T[i].parent = 0;
T[i].Left = 0;
T[i].Right = 0;
}
//添加新的节点
for(i = n+1;i<=m;i++){
select(T,&min1,&min2,i-1);//我们挑选出最小和次小的两个节点
// printf("%d %d\n",T[min1].weight,T[min2].weight);
T[i].weight = T[min1].weight+T[min2].we