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

这篇博客介绍了一个基于给定字符频度构建哈弗曼树并进行编码和译码的过程。首先,根据字符频度创建哈弗曼树,并为每个字符生成对应的哈弗曼编码。接着,对给定的字符串进行编码,然后将编码串进行译码,恢复原始字符串。样例输入包括字符频度、待编码字符串和待译码编码串,输出展示了每个字符的编码、编码串和译码后的字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

假设某通信报文的字符集由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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值