霍夫曼树_实验报告选读.docVIP

  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文档。上传文档
查看更多
西安交通大学实验报告 课程 数据结构 实验名称 树的遍历及霍夫曼树 第 1 页 共 页 系别__ 自动化 实 验 日 期 / 2014 年 11 月 22 日 专业班级 自动化43班 实 验 报 告 日 期 2014 年 12月 7 日 姓名 李欣阳 学号 2140504066 报 告 退 发 ( 订正 、 重做 ) 同 组 人 无 教 师 审 批 签 字 一、实验目的 1. 掌握结构体、指针及二叉树的生成、遍历等基本操作; 2. 掌握霍夫曼树编码译码的原理; 3. 熟练掌握树的基本操作。 二、实验内容与要求 1. 通过键盘输入一段字符(长度≥20),构建霍夫曼树; 2. 根据该树求每个字符的编码,并对该字符串进行编码; 3.将获得的编码进行译码; 4.基于该霍夫曼树,实现非递归的先序遍历算法来输出该树中的叶子节点; 三、问题分析 对于固定的叶子节点数和权值,带权路径最短的二叉树称为霍夫曼树或者最优二叉树,霍夫曼树可以用来设计二进制的前缀编码。假设有一棵二叉树,其叶子节点分别为A、B、C、D1,连接根节点与右子树的树枝为0,则在对树进行先序遍历时,记录下经过的边即可得到一个二进制序列,这个二进制序列可以作为相应叶子节点字母的霍夫曼编码,这就是霍夫曼编码的基本思路。 3.1 霍夫曼树的创建 利用二叉树进行编码译码,并且使编码具有最佳的使用效果,就要满足以下两个基本条件: 任何两个不同的字符或者字符串不能有相同的编码,这就要求每个字符都有其独特的唯一的编码,即任意一个字符的编码都不能是另一个字符编码的前缀; 字符串的编码要尽可能的短,以便于存储和解码。 基于以上编码要求,选择霍夫曼树作为字符编码译码的工具是合理的。霍夫曼树的构建方法如下: 根据给定的n个权值构成n棵二叉树的集合F,其中没课二叉树中只有一个 带权的根节点,其左右子树均为空; 在F中选取两棵根节点最小的树作为左右子树构造一颗新的二叉树,且置新的二叉树的根节点的权值为其左右子树上根节点的权值之和; 在F中删除这两棵树,同时将构建的新的二叉树加入F中; 重复(2)和(3)知道F中只含一棵树为止,这棵树就是霍夫曼树。 3.2 字符权值的确定 基于以上霍夫曼树的构建方法,进行编码操作的前提就是获取待编码的字符串的中各字符的权值,因此要设计算法求得各字符权值。 首先以字符数组的方式存储字符串构造字符数组char Letter[]用于存储字符串中出现的字符整形数组int Weight[]用于存储对应字符的权重char Letter[]的第一个位置并设置标志flagchar Letter[]的第一个位置和字符串的各位置依次进行比较如果相同则flagint Weight[]相应位置增加flag=0表明出现新字符;以此类推知道所有字符的flag标记都为char Letter[]并且其权重已经记录在int Weight[]数组中char Letter[]和int Weight[]数组就可以作为构建霍夫曼树的依据了ADT Tree{ 数据对象D:D是具有相同特性的数据元素的集合。 数据关系R:若D为空集,则称为空树; 若D仅含有一个数据元素,则R为空集,否则R={H},H是如下二元关系: (1) 在D中存在唯一的称为根的数据元素root,它在关系H下无前驱; (2) 若D-{root}≠NULL,则存在D-{root}的一个划分D1,D2,D3, ?,Dm(m0),对于任意j≠k(1≤j,k≤m)有Dj∩Dk=NULL,且对任意的i(1≤i≤m),唯一存在数据元素xi∈Di有root,xi∈H; (3) 对应于D-{root}的划分,H-{root,xi,?,root,xm}有唯一的一个划分H1,H2,?,Hm(m0),对任意j≠k(1≤j,k≤m)有Hj∩Hk=NULL,且对任意i(1≤i≤m),Hi是Di上的二元关系,(Di,{Hi})是一棵符合本定义的树,称为根root的子树。 基本操作P:(略去大部分) InitTree(T); 操作结果:构造空树T。 DestroyTree(T); 初始条件:树T存在。 操作结果:销毁树T。 LeftChild(T,cur_e); 初始条件:树T存在,cur_e是T中某个结点。 操作结果:若cur_e是T的非叶子结点,则返回它的最左孩子,否则返回“空”。 }ADT Tree 4.2 树结构的C语言定义 typedef struct HfNode { in

文档评论(0)

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

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

1亿VIP精品文档

相关文档