- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构与算法实验报告_3霍夫曼树
实验四
数据结构与程序设计专题实验报告
赫夫曼树
学院:物理与电子学院
班级:电信1105班
姓名:刘岩
学号:1404110729
实验报告
一、实验任务
实验题目:数据结构与程序设计专题实验
二、实验内容
实验三:树的基本操作及基于霍夫曼树的编码/译码
(一)实验目的:掌握结构体、指针及二叉树的生成、遍历等操作掌握霍夫曼编码/译码的原理。
(二)基本要求:熟练掌握树的操作。
(三)内容提要:给定一段字符,构建霍夫曼树;根据该树求每个字符的编码,并对该段字符串进行编码;将得到的编码进行译码;基于该霍夫曼树,通过遍历算法来输出该树中的叶子节点。
注:在实现时要求霍夫曼树的左右孩子的大小关系(左孩子节点值小于右孩子节点),在遍历的时候也可以为递归与非递归办法寻找叶子节点。
三、要点分析
题目中涉及的主要知识点:
1、本程序参考霍夫曼算法(由给定的权值构造赫夫曼树):
(1)由给定的n个权值{w0, w1, w2, …, wn-1},构造具有n棵二叉树的集合F = {T0, T1, T2, …, Tn-1},其中每一棵二叉树Ti只有一个带有权值wi的根结 点,其左、右子树均为空。
(2)重复以下步骤, 直到F中仅剩下一棵树为止:
① 在F, 做为左、右子树构造一棵 新的二叉树。置新的二叉树的根结点的权值为其左、右子树上根结点的 权值之和。
② 在F
③ 把新的二叉树加入F
把d1,d2,…, dn 作为叶子结点,把w1,w2,…,wn作为叶子结点
的权,构造赫夫曼树。在赫夫曼树中结点的左分支赋0,右
分支赋1,从根结点到叶子结点的路径上的数字拼接起来就
是这个叶子结点字符的编码。
3、译码的过程是分解电文中的字符串,从根出发,按字符‘0’或‘1’确定找 左孩子或右孩子,直至叶子节点,便求得该子串相应的字符。
四、程序的算法描述
1、所用存储结构:
typedef struct HfNode
{
int weight;
int parent,lchild,rchild;
}HfNode,*HuffmanTree; //动态分配数组存储霍夫曼树
typedef char **HuffmanCode; //动态分配数组存储霍夫曼编码表
程序中各函数的简要说明:
(1)void Select(HuffmanTree HT,int i,int a,int b)
从前i个节点中选择权值最小的两个节点分别存入a,b中。设置a,b两个变量用“打擂台”的方 法求出两个最小值。
(2)void CreatHuffmanTree(HuffmanTree HT,int n,int Weight[])
根据Weight[53]及Letter[52]中的信息建立具有2n-1个节点的Huffman树。 首先创建有2*n-1 个节点的存储空间,将前n个节点的权值付为对应的Weight[i],双亲结点和左右孩子结点均置 为零。剩余结点的权值、双亲结点和左右孩子结点置为零。之后,i从n+1到2*n-1每次加1, 在HT[1..i-1]中选取parent为零且weight最小的两个节点,将他们的双亲结点置为HT[i]。
(3)void HuffmanCoding(HuffmanTree HT,HuffmanCode HC, int n)
获得n个字符的Huffman码。从叶子节点到根逆向求编码。先求叶子结点的双亲结点,如果该结 点为左孩子,则在Huffman码中从后往前字符置为‘0’;若为右孩子则置为‘1’,直至根节点结 束。
(4)char *HuffmanEncoding(HuffmanCode hc, int n,char Text[],char Letter[])
对输入文本进行Huffman编码。将要编码的字符串传入函数,截取一个字符,与编码表中的字符 比较,找到对应的huffman码,连接到编码串后,直至所有的字符都读入。
(5)void HuffmanDecoding(HuffmanTree HT, char a[], int n,char Letter[])
对输入文本进行Huffman解码。从根结点出发,按字符‘0’,‘1’确定找左孩子或右孩子,直至 叶子结点,便求得该子串相应的字符。将所有子串找遍,得译码结果。
(6)int Sta
文档评论(0)