哈夫曼树的建立与操作.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文档。上传文档
查看更多
实验六哈夫曼树的建立与操作一、实验要求和实验内容1、输入哈夫曼树叶子结点(信息和权值)2、由叶子结点生成哈夫曼树内部结点3、生成叶子结点的哈夫曼编码4、显示哈夫曼树结点顺序表二、实验要点:根据哈夫曼算法,建立哈夫曼树时,可以将哈夫曼树定义为一个结构型的一维数组HuffTree,保存哈夫曼树中各结点的信息,每个结点包括:权值、左孩子、右孩子、双亲,如图5-4所示。由于哈夫曼树中共有2n-1个结点,并且进行n-1次合并操作,所以该数组的长度为2n-1。???????????????   构造哈夫曼树的伪代码如下:??????在哈夫曼树中,设左分支为0,右分支为1,从根结点出发,遍历整棵哈夫曼树,求得各个叶子结点所表示字符的哈夫曼编码。? 三、.函数的功能说明及算法思路BTreeNode* CreateHuffman(ElemType a[],int n)//构造哈夫曼树1.对给定n个权值{a1,a2,…,an}的叶子结点,构成具有n棵二叉树的森林F={T1,T2,…,Tn}, 其中每棵二叉树Ti只有一个权值为ai的根结点,其左右子树为空。2.在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且新的二叉树的根结点的权值为其左右子树上根结点的权值之和。3.从F中删除构成新树的两棵树,并把新树加入到F中。4.重复 2、3两步,直到F只有一棵树为止。则F中的树就是哈夫曼树。void PrintBTree(BTreeNode *BT)//以广义表形式输出哈夫曼树主要用到了递归的思想。void HuffManCoding(BTreeNode *BT, int len)//求哈夫曼编码构造一棵二叉树,左分支标识为0,右分支标识为1,把 n 个字符看成是一棵树的 n个叶子结点,把从根结点到每个叶子结点路径上的分支标识序列作为字符的编码,则得到哈夫曼编码。四、实验步骤和提示1、编写有关哈夫曼树操作的函数:①构造哈夫曼树 BTreeNode? * CreateHuffman(ElemType a[],int n); ②以广义表形式输出哈夫曼树 void PrintBTree(BTreeNode *BT); ③求哈夫曼编码 void HuffManCoding(BTreeNode *BT, int len)。把结构定义以及这些哈夫曼树操作函数存放在头文件Haffman.h中。2、设在一份电文中共使用5种字符,各字符在电文中出现的频率依次为2, 6, 3, 8, 7。编写相应的测试程序来输出编码哈夫曼树及各字符的哈夫曼编码。测试程序(即主函数)存放在文件test7.cpp中。? #includeiostream#defineMAX 20usingnamespace std;typedefcharvalType;typedefdoublewghType;structHFMnode{valType data;wghType weight;int parent;int lchild;int rchild;};//每个节点的编码//code存储编码//start存储编码是从code数组的第几个开始//在编码过程中从叶子节点向根节点逆推structHFMcode{char code[MAX];int start;};//建立哈夫曼树void createHFMtree(HFMnode *node, intn){int i;//m1,m2为当前还没用到的节点中权值最小和次小的权值int m1, m2;//l,r为每次构建一个父节点其左右儿子节点的序号int l, r;for (i = n + 1; i = 2 * n - 1; i++){m1 = m2 = 32767;l = r = 0;int k;for (k = 1; k = i - 1; k++)if (node[k].parent == 0){if (node[k].weightm1){m2 = m1;r = l;m1 = node[k].weight;l = k;}elseif(node[k].weightm2){m2 = node[k].weight;r = k;}}node[i].weight = node[l].weight + node[r].weight;node[i].lchild = l;node[i].rchild = r;node[l].parent = i;node[r].parent = i;}}//求每个节点的哈夫曼编码void createHFMcode(HFMnode *node, HFMcode *hcode, intn){int i;for (i = 1; i = n; i++){HFMcode d;//哈夫曼树最大层数就是元素的个数d.start = n;

文档评论(0)

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

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

1亿VIP精品文档

相关文档