哈夫曼树的建立及应用
更新时间:2023-12-18 13:58:01 阅读量: 教育文库 文档下载
哈夫曼树的建立及应用
1、 给定权值5,29,7,8,14,23,3,11,建立哈夫 曼树,输出哈夫曼编码。
2、对上述给定的哈夫曼树及得到的哈夫曼编码,试输入一串二 进制编码,输出它的哈夫曼译码。
三、算法描述
将建立哈夫曼树、实现哈夫曼编码、哈夫曼译码都定义成子函数的形式,然后在主函数中调用它们。
建立哈夫曼树时,将哈夫曼树的结构定义为一个结构型的一维数组,每个元素含有四项:权值,双亲,左孩子,右孩子。给定的权值可以从键盘输入,要输出所建立的哈夫曼树,只要输出表示哈夫曼树的一维数组中的全部元素即可。
要实现哈夫曼编码,只要在所建立的哈夫曼树上进行二进制编码:往左走,编码为0,往右走,编码为1,然后将从根结点到树叶中的所有0、1排列起来,则得到该树叶的哈夫曼编码。哈夫曼编码可以用一个结构型的一维数组保存,每个元素包含:编码、编码的开始位置、编码所对应的字符三项。
程序清单:
#include
constint m=2*n-1;
struct Tree //哈夫曼树的一个结点 {
intparent,lchild,rchild; //双亲,左孩子,右孩子 int weight; //权值 };
structcodetype //哈夫曼编码 {
int bits[n+1]; //编码存放的位置 int start; //编码开始存放的位置 char ch; //编码对应的字符 };
Tree huffTree[m+1]; codetype code[n+1];
void Select() //搜索权值最小的两个数并合并成哈夫曼树 {
intx,y;
int j,min1,min2;
for(int k=n+1;k<=m;k++) //合并成哈夫曼树 {
min1=min2=32767; x=y=0;
for(j=1;j<=k-1;j++) //找出权值最小的两个数 if(huffTree[j].parent ==0)
if(huffTree[j].weight min2=min1; min1=huffTree[j].weight ; y=x; x=j; } else if(huffTree[j].weight min2=huffTree[j].weight; y=j; } huffTree[x].parent=k; huffTree[y].parent=k; huffTree[k].lchild=x; huffTree[k].rchild=y; huffTree[k].weight=huffTree[x].weight+huffTree[y].weight; } } void HuffmanTree() //构造哈夫曼树 { for(inti=1;i<=m;i++) { huffTree[i].parent=0; huffTree[i].lchild=0; huffTree[i].rchild=0; huffTree[i].weight=0; } cout<<\请输入\个权值\ for(i=1;i<=n;i++) cin>>huffTree[i].weight; Select(); } void Huffcode() //哈夫曼编码 { codetype cd; intc,p; for (inti=1;i<=n;i++) { cd.start=n+1; cd.ch=96+i; //第一个字符为a,并依次排字符 c=i; p=huffTree[i].parent; while(p!=0) { cd.start--; if(huffTree[p].lchild==c) cd.bits[cd.start]=0; else cd.bits[cd.start]=1; c=p; p=huffTree[p].parent; } code[i]=cd; } for(i=1;i<=n;i++) { cout<<\字符\的权值为\编码是:\ for(int j=code[i].start;j<=n;j++) cout< void tranHuffcode() //哈夫曼译码 { inti=m;char b; cout<<\请输入一串二进制编码以(0和1以外的数结束)\ cin>>b; while((b=='0')||(b=='1')) { if(b=='0') i=huffTree[i].lchild; : else i=huffTree[i].rchild; if(huffTree[i].lchild==0) { cout< cin>>b; } } void main() { HuffmanTree(); //建立哈夫曼树 Huffcode(); //实现哈夫曼编码 tranHuffcode(); //实现哈夫曼译码 } 运行结果:
正在阅读:
哈夫曼树的建立及应用12-18
田中访友作文600字07-15
主题婚礼策划方案【最新10篇】03-22
做有特色、有个性的教师03-10
吃月饼作文300字9篇02-06
餐饮销售推销菜品常识06-03
2011届高考复习3年高考2年模拟:第五章 植物生命活动的调节上04-26
心理学专业外语翻译第7页11-29
狭水道航行方法的探讨05-20
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 哈夫曼
- 建立
- 应用
- 2012覃珍珍报关员精讲班作业部分43
- 全面建设小康社会说课稿
- 2016年上半年重庆省高级防水工程师模拟试题
- 广东省自考混凝土及砌体结构 复习要点
- 银行副职竞聘演讲稿
- 我国水污染责任保险制度法律研究
- 蚌埠学院2018年专升本各专业拟录取名单 - 图文
- 虹吸雨水斗图集
- 建筑工程造价的动态管理与成本优化控制
- 广东2012年会计从业资格考试会计基础模拟试卷
- 2017届《金版教程》历史一轮复习题库(通史版):选修三 20世纪的战争与和平 选3-3a
- 单收入家庭麟龙讲解如何换房理财
- 连云港市总工会
- 房地产大纲和参考文献
- 2013年我国卫生和计划生育事业发展统计公报
- 广东华南粮食交易中心
- EXCEL学习笔记
- 众安全生产监督员工作信息反馈表
- 广工测试技术USB7325A说明书
- 南京卫岗乳业有限公司网络营销方案策划