哈夫曼编码
【问题描述】
读入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