- 1、本文档共125页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
图7-26 具有不同加权路径长度的二叉查找树 7.6.2 哈夫曼树的构造 那么怎样才能构造出一棵有最小叶结点加权路径长度的二叉树呢-这就是以下要讨论的哈夫曼算法和哈夫曼树。 哈夫曼算法的算法思想简述如下: (1) 给定一组权值的数列WG ={W1,W2,…,Wn},把权值赋给n个结点,从而生成一个森林F,使得F中有n棵只有一个根结点的树Ti,并且Ti带有权值Wi; (2) 将森林F中的树按根的权值由小到大排序; (3) 从森林中取出第一和第二棵树构成一棵新树,使新树根的权值为两棵树的根的权值之和,并且以第一棵为新树的左子树,第二棵为右子树,再把该树放到森林F中; (4) 重复执行步骤(2)、(3),直到森林F中只有一棵树为止。 按哈夫曼算法构造的叶结点带权的二叉树为哈夫曼树。 设有一组权值WG={8,5,2,4},其哈夫曼树的构造过程如图7-27所示。 图7-27 哈夫曼树的构造过程 7.6.3 哈夫曼树的应用 在利用哈夫曼树的结构时,权值为查找频率,频率越大就越靠近根结点,这样可以构造成最佳判断过程。我们把整个判断过程看成二叉树,以开始测试作为根结点,测试或判断的结果分成两个方向,选其中的一个分支再作进一步的测试和判断,最后得到某测试数据的属性。例如,完成对一批正整数进行分类,其要求如下: (1) 某数ai≤20,属于第一类,出现频率为2/18; (2) 20<ai≤50,属于第二类,出现频率为4/18; (3) 50<ai≤100,属于第三类,出现频率为5/18; (4) ai>100,属于第四类,出现频率为7/18。 给出的每一个数都要求判断是否属于第n类,可按一般的逻辑顺序得到判断过程之一。如图7-28所示,按此判断过程,将得到平均执行时间为最长。 图7-28 一般逻辑判断过程 对以上的判断方式作一点修改,即按哈夫曼树的构造原则组织判断过程,如图7-29所示,则判断过程的平均执行时间时间最短。 图7-29 哈夫曼树应用于判断过程 7.7 二叉树的应用举例 前面介绍了二叉树的先根、中根和后根遍历的算法。若以C语言在计算机中实现二叉树的遍历或应用二叉树的遍历解决实际问题,则先要建立二叉树的链表结构。我们可以用多种方法建立二叉树,这里介绍用线性表的方式存储二叉树的数据域和指针域。如对图7-20所示的二叉树建立三个线性表:DATA(i)、RLINK(i)和LLINK(i),i =1,2,…,7。图7-30表示了存储状态,其中T是树的入口。 图7-30 对图7-20所示的二叉树的线性表表示 建立线性表的存储表示,可以用如下的变量说明和过程表示图7-20所示的二叉树: char data [8]; int rlink [8],llink [8]; int i,j,l; char k ; CREATE( ) { for( i =1;i<=7;i++) { scanf(%d%d%d,j,k,l); /* j是序号为i的左子树,l是i的右子树,k是结点i的数据值 */ data [i] = k; rlink [i] = j; llink [i] = l; } t = 6; /* 建立二叉树的入口 */ } 实现以上的算法,可以建立一棵以T(T=6)为入口的二叉树。如要得到序号为7的结点的值“E”,其路径为:从T=6入口,以LLINK(6)=5,得到6号结点的左子树的根为5号结点,再从5号结点的右子树RLINK(5)=7,得到7号结点,然后从DATA(7)得到该结点的值“E”。 我们可以从二叉树的遍历中,访问每一个结点的关键值,查询和检索二叉树中所需要的信息。 例7.1 有一棵二叉树,入口为T,每一个结点存放着某企业中职工的工号“no”、职工的工资数“a1”、职工的工龄“a2”等,要求通过遍历二叉树,输出工资a1中大于h并且工龄数大于k的职工的工号。 下面我们用C语言,以中根遍历的非递归算法实现以上的设计要求。 struct treenode { char no,a1,a2; struct treenode * rnext,* lnext; } n =1000; struct treenode * h,* i,* stack [n]; char g [n]; char h,k; int top,p,j; SLB(struct treenode * h
您可能关注的文档
最近下载
- 产业孵化中心项目可行性研究报告.docx
- EPC工程总承包项目商务创效及管理-11-23.pptx VIP
- 部编版三年级语文复习(上册)-基础训练.pdf
- 三年级上册道德与法治期末测试卷及参考答案(完整版).pdf
- 2024年世界职业院校技能大赛高职组“导游服务组”赛项参考试题库(含答案).doc VIP
- QS18A-型万能电桥说明书.pdf VIP
- 名著《安娜卡列尼娜》读后分享读书笔记PPT课件(带动画可编辑).pptx
- 孙权劝学(解析版)-2024年中考语文之文言文对比阅读(全国通用).pdf VIP
- 2023年北京昌平高二(上)期末语文(教师版).pdf VIP
- 消防机器人灭火救援应用技术分析.pptx VIP
文档评论(0)