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