网络多媒体实验报告.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
网络多媒体实验报告

网络多媒体上机实验一班级:学号:姓名:教师:题目构造一棵哈夫曼树分析既然是二叉树那么我们首先就定义一个二叉树结构:struct tree{???????? char date;//数据???????? bool min;//叶子节点???????? int quanzhi;//权值???????? struct tree *zuo,*you;//左右孩子}*tre;其中权值是我们最需要关心的,因为我们就是要通过权值来构造,但权值怎么规定呢?当然是根据实际情况来!其中叶子节点是为了标记是叶子节点,便于后期编码!为了简单说明,第一个例子就直接定义多个哈夫曼树节点,然后通过这些节点来构造出最终的哈夫曼树!tree tr[9]={{a,true,5},{b,true,2},{c,true,9},{d,true,3},{e,true,6}};tr是一个哈夫曼数组,其中每个元素都是一个哈夫曼树,我们的任务就是将这些元素“整合”起来,使它们联系起来构成一个哈夫曼树。初始时,数组每个元素都是没有联系的,我们的任务就是把它们通过struct tree *zuo,*you;//左右孩子? 来连接起来,形象上就是构成一棵二叉树。我们先通过语言叙述的方法来构造一棵哈夫曼二叉树:a 权值5b权值2c权值9d权值3e权值6首先,取权值最小的两个节点“整合”出一个新的节点,该节点的权值为最小两个节点权值之和。如下图:然后,将这个新的节点与剩下元素进行权值比较,依旧取最小的两个权值节点构造 新的节点,反复这个过程,直到取完所有元素,本例的哈夫曼树如下图:其中叶子节点(也就是2,3,5,6,9)是有效的数据节点!构造时节点的左右顺序并不影响哈曼树的构造,但会导致出现不同的编码,当然编码只要不出现前缀码就是正确的编码。实现算法通过上面的例子,我们知道构造一个哈夫曼树,需要的节点数数有效数据节点的2*n-1,其中n是有效数据的个数,如上面例子,有效数据个数有5个,但最终构造出的哈夫曼树有2*5-1=9个节点,所以根据这个性质就可写出一种算法:tree tr[9]={{a,true,5},{b,true,2},{c,true,9},{d,true,3},{e,true,6}};5个数据所以需要9个空间,其中9-5=4个空间是给那些无效节点使用的(哈夫曼树种非叶子节点)。首先,我们遍历这个数组,找到最小的两个元素。然后,将他们移动到前面,并将权值求和构造出新的节点,新的节点左右子树指向最小的两个元素,将这个新节点插入有效数据后面。最后,从第2+1个元素(前面两个无需遍历了)开始重新遍历。重复上述过程,直到数组填满,填满后的最后一个元素就是最终的哈夫曼树。如第一次遍历后数组tr[9]状态就变为:tree tr[9]={ {d,true,3},{b,true,2},{c,true,9}, {a,true,5},{e,true,6},{‘’,false,5,tr[0],tr[1]}}最小的两个元素移到了前面,有效数据增加了一个,并且新节点左右子树指向前面两个元素。代码#include stdafx.h#includestatic int hfmb=0;struct tree{???????? char date;//数据???????? bool min;//叶子节点???????? int quanzhi;//权值???????? struct tree *zuo,*you;//左右孩子}*tre;struct shfm{???????? char date;//字符数据???????? char bianm[11];//哈夫曼编码,最大编码数为11(可根据实际修改!)}hfm[100];//哈夫曼编码对应真实数据表void gettree(tree tr[],int shij,int youx)//构造哈夫曼树,tr树集合,shij集合实际数据个数,youx集合有效数据个数{???????? //模拟动态增长数组,每次构造新的树就插入有效数据后面???????? if (2*youx-1!=shij)???????? {?????????????????? printf(参数不符合!);?????????????????? return;???????? }???????? int c=0;???????? while(youx!=shij)//当有效个数==实际个数时,构造完成!???????? {?????????????????? for (int i=c;i?????????????????? {//每次循环取两个最小值并将两个最小值放置在当前循环起始两位??????????????????????????? if (tr[i].quanzhi?????????

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档