哈弗曼树

该博客介绍了如何根据字符的权值自底向上构造哈弗曼树,并自顶向下生成每个字符的哈夫曼编码。内容包括输入和输出的具体形式,以及样例输入和输出,强调了在构建过程中左子树权值小于右子树权值的原则。

哈夫曼编码

【问题描述】

读入n个字符所对应的权值,自底向上构造一棵哈夫曼树,自顶向下生成每一个字符对应的哈夫曼编码,并依次输出。

【输入形式】

输入的第一行包含一个正整数n,表示共有n个字符需要编码。其中n不超过100。

第二行中有n个用空格隔开的正整数,分别表示n个字符的权值。

【输出形式】

共n行,每行一个字符串,表示对应字符的赫夫曼编码。

【注意】保证每次左子树比右子树的权值小;如出现相同权值的,则先出现的在左子树。

【样例输入】

8
5 29 7 8 14 23 3 11

【样例输出】

0001
10
1110
1111
110
01
0000
001

#include <bits/stdc++.h>
using namespace std;
/*哈弗曼树*/
#define N 100   //叶子节点的最大值
#define M N*2-1   //所有节点的最大值
typedef struct
{
   
   
    int weight;   //节点的权值
    int parent;   //双亲下标
    int Lchild;
    int Rchild;
} HTNode,HuffmanTree[M+1];
typedef char *HuffmanCode[N+1];

void select(HuffmanTree ht,int k,int *s1,int *s2)//从1~i-1选择两个parent为0&weight最小的节点,其序号下标给s1,s2
{
   
   //其实已经排过许了,不需要后面循环,直接找到s1后,s2=s1+1,但到最后一个可能有bug
    int i;
    for(i=1;i<=k&&ht[i].parent!=0;++i);
    *s1=i;
    for(i=1; i<=k; ++i){
   
   
		if(ht[i].parent==0 && ht[i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值