题目描述
假设某通信报文的字符集由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<stdlib.h>
#include<stdio.h>
#include<string.h>
#define N 6
#define M 2 * N - 1
typedef char *Huffmancode[6];
typedef struct
{
int weight;
int parent, Lchild, Rchild;
}HTNode, HuffmanTree[M + 1];
//挑选哈夫曼书前n项中权值最小,且parent不为0的两个值的下标
void select(HuffmanTree ht, int n, int *s1, int *s2)
{
int c[30] = {
0 };
int i, j, h;
int cut = 0;
for (i = 1; i <= n; i++)
{
if (ht[i].parent == 0)
{
c[cut] = ht[i].weight;
cut++;
}
}
//冒泡排序
for (i = 0; i < cut; i++)
{
for (j = 0; j < cut - i - 1; j++) {
if (c[j] > c[j + 1])
{
h = c[j];
c[j] = c[j+1];
c[j+1] = h;
}
}
}
for (i = 1; i <= n; i++)
{
if (c[0] == ht[i].weight)
*s1 = i