给定权值,哈弗曼编码、译码

题目描述

假设某通信报文的字符集由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
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值