- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构 6章 树
赫夫曼树的定义 路径:从树中一个结点到另一个结点之间的分支构成两个结点之间的路径. 路径长度:路径上的分支数目称作路径长度. 树的路径长度:从树根到每一结点的路径长度之和. 带权路径长度:结点的带权路径长度为该结点到树根之间的路径长度与结点上权的乘积. 树的带权路径长度:树中所有叶子结点的带权路径长度之和. 带权路径长度WPL最小的二叉树称作赫夫曼树. * * WPL_a=5*1+15*2+40*3+30*4+10*4 = 315 WPL_b=5*3+15*3+40*2+30*2+10*2 = 220 15 二叉树a 5 40 30 10 二叉树b 5 15 40 30 10 赫夫曼树的构造过程 (1)将给定的n个权值{w1,w2,...,wn}作为n个根结点的权值构造一个具有n棵二叉树的森林{T1,T2,...,Tn},其中每棵二叉树只有一个根结点; (2)在森林中选取两棵根结点权值最小的二叉树作为左右子树构造一棵新二叉树,新二叉树的根结点权值为这两棵树根的权值之和; (3)在森林中,将上面选择的这两棵根权值最小的二叉树从森林中删除,并将刚刚新构造的二叉树加入到森林中; (4)重复上面(2)和(3),直到森林中只有一棵二叉树为止。这棵二叉树就是哈夫曼树。 假设有一组权值{5,15,40,30,10},下面我们将利用这组权值演示构造哈夫曼树的过程。 * * 5 15 40 30 10 5 15 40 30 10 15 5 10 15 30 15 30 40 5 10 15 30 15 30 60 40 5 10 15 30 15 30 60 40 WPL = 40*1+30*2+15*3+10*4+5*4 = 205 赫夫曼编码 当年赫夫曼树的研究主要为了解决远距离通信数据传输的最优化问题。 假设我们只用6个字母 ABCDEF 表示一段文字,这些字母可以用相应的二进制数表示:A(000)B(001)C(010)D(011)E(100)F(101)。 这样传输”BADCADFEED”就是”001000011010000011101100100011”(共30个字符) 事实上,字母出现的频率不是相等的,假设六个字母的频率 A 27, B 8, C 15, D 15, E 30, F 5 我们可以按赫夫曼树来规划他们 然后得到新的二进制编码: A(01)B(1001)C(101) D(00)E(11)F(1000) 字符串的新编码为:(共25个字符) “1001010010101001000111100” 注意:若要设计长短不一的编码, 则必须是任一字符的编码都不是另一个字符的编码的前缀,这种编码叫“前缀编码” 一般地,赫夫曼编码的过程为(1)利用字符集中每个字符的使用频率作为权值构造一个哈夫曼树;(2)从根结点开始,为到每个叶子结点路径上的左分支赋予0,右分支赋予1,并从根到叶子方向形成该叶子结点的编码。 * * 5 8 13 28 15 30 58 27 15 42 F B C E A D 0 1 1 0 0 1 0 1 0 1 总结回顾 树的递归定义,子树/结点/度/叶子/分支结点/双亲/孩子/层次/深度/森林等概念 树的存储结构:双亲表示法,孩子表示法,孩子兄弟表示法。 一种重要的树:二叉树,每个结点最多两棵子树,有左右之分。有斜树,满二叉树,完全二叉树等特殊形式。 二叉树的性质,存储结构,和*遍历方法*(可用非递归方式) 线索二叉树利用了二叉链表中浪费的空指针,提高二叉树的结点查找和遍历的效率。 树和森林看似复杂,其实都可以转化为简单的二叉树来处理。 赫夫曼树和赫夫曼编码是二叉树的一个典型应用。 * * * 二叉树的链式存储结构 * * 二叉树每个结点最多有两个孩子,所以为它设计一个数据域(data)和两个指针域(lchild, rchild)。 lchild data BiTNode rchild /* 二叉树的二叉链表结点结构定义 */ typedef int TElemType; /* 树结点的数据类型 */ typedef struct BiTNode /* 结点结构 */ { TElemType data; /* 结点数据 */ struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; A 头指针 B C D E ^ 思考:如何查找双亲结点? A B C D H I E J F G ^ F ^ ^ G ^ ^ H ^ ^ I ^ ^ J ^ 内容提要 树的逻辑定义和存储结构 二叉树的逻辑定义和存储结构 二叉树的遍历和基本操作 线索二叉树 树和二叉树的互换 哈夫曼树及其应用 * * 二叉树的遍历 二叉树的遍历(traversing bi
文档评论(0)