原文链接:https://www.dreamwings.cn/ytu3027/2899.html
3027: 哈夫曼编码
时间限制: 1
Sec 内存限制: 128
MB
提交: 2 解决: 2
题目描述
设计一个程序,构造一颗哈夫曼树,输出对应的哈夫曼编码。
输入
输入数据有两行,第一行为一个整数n,代表接下来要输入n个整数,然后我们用这n个整数构造一个哈夫曼树。
输出
输出对应的哈夫曼编码,每一个哈夫曼编码占一行。
样例输入
8 7 19 2 6 32 3 21 10
样例输出
1010 00 10000 1001 11 10001 01 1011
先建立哈夫曼树,然后从原有数据所在叶子节点向上回溯,保存哈夫曼编码输出~
AC代码:
#include<iostream> #include<stdio.h> #define MAXVALUE 0xfffff using namespace std; typedef struct //构造哈夫曼树结点 { int weight; //权值 int parent; //父节点 int lchild; //左子树 int rchild; //右子树 } HNodeType; HNodeType HFMTree[105];//结点数 typedef struct //构造哈夫曼编码数组 { int bit[105]; int start; } HCodeType; HCodeType HFMCode[105]; void CreateHTree(HNodeType HFMTree[],int n)//创建哈夫曼树 { int m1,x1,m2,x2,i,j; for(i=0; i<2*n-1; i++) //初始化 HFMTree[i].parent=HFMTree[i].lchild=HFMTree[i].rchild=-1; for(i=0; i<n; i++) cin>>HFMTree[i].weight; for(i=0; i<n-1; i++) { x1=x2=MAXVALUE; m1=m2=0; for(j=0; j<n+i; j++) { if(HFMTree[j].parent==-1&&HFMTree[j].weight<x1) { x2=x1; m2=m1; x1=HFMTree[j].weight; m1=j; } else if(HFMTree[j].parent==-1&&HFMTree[j].weight<x2) { x2=HFMTree[j].weight; m2=j; } } HFMTree[m1].parent=n+i; HFMTree[m2].parent=n+i; HFMTree[n+i].weight=HFMTree[m1].weight+HFMTree[m2].weight; HFMTree[n+i].lchild=m1; HFMTree[n+i].rchild=m2; } } void CreateHCode(HNodeType HFMTree[],HCodeType [],int n) //转化编码 { HCodeType cd; int i,j,c,p; for(i=0; i<n; i++) { cd.start=n-1; c=i; p=HFMTree[c].parent; while(p!=-1) { if(HFMTree[p].lchild==c)cd.bit[cd.start]=0; else cd.bit[cd.start]=1; cd.start--; c=p; p=HFMTree[c].parent; } for(j=cd.start+1; j<n; j++) HFMCode[i].bit[j]=cd.bit[j]; HFMCode[i].start=cd.start+1; } } int main() { int i,j,n; cin>>n; CreateHTree(HFMTree,n); CreateHCode(HFMTree,HFMCode,n); for(i=0; i<n; i++,puts("")) for(j=HFMCode[i].start; j<=n-1; j++) cout<<HFMCode[i].bit[j]; return 0; }