- 1、本文档共96页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
森林的遍历 森林的二叉树表示 (4) 广度优先遍历(层次序遍历) : ? 若森林F为空,返回;否则 ? 依次遍历各棵树的根结点; ? 依次遍历各棵树根结点的所有孩子; ? 依次遍历这些孩子结点的孩子结点。?? 具有不同路径长度的二叉树 6.6 赫夫曼树 (Huffman Tree)及其应用p144 路径长度 (Path Length) 两个结点之间的路径长度是连接两结点的路径上的分支数。 树的路径长度是根结点到每个结点的路径长度之和。 n个结点的二叉树的路径长度不小于下述数列前n项的和,即 其路径长度最小者为 带权路径长度 ( Weighted Path Length, WPL ) 树的带权路径长度是树的各叶结点所带的权值与该结点到根的路径长度的乘积的和。 具有不同带权路径长度的扩充二叉树 赫夫曼树 带权路径长度达到最小的二叉树即为赫夫曼树(最优二叉树)。 在赫夫曼树中,权值大的结点离根最近。 赫夫曼树的应用 在解决某些判定问题时,利用赫夫曼树可以得到最佳判定算法 p145图6.23 用于通讯和数据传送时的赫夫曼编码 任一字符的编码都不是另一字符编码的前缀,称为前缀编码。p146 赫夫曼算法 ——如何构造一棵赫夫曼树 (1)由给定的n个权值{w0, w1, w2, …, wn-1},构造具有n棵二叉树的森林F = {T0, T1, T2, …, Tn-1},其中每一棵二叉树Ti只有一个带有权值wi的根结点,其左、右子树均为空。 (2)重复以下步骤, 直到F中仅剩下一棵树为止: ① 在F中选取两棵根结点的权值最小的二叉树, 做为左、右子树构造一棵新的二叉树。置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。 ② 在F中删去这两棵二叉树。 ③ 把新的二叉树(追)加入到F中。 赫夫曼树的构造过程 赫夫曼编码 主要用途是实现数据压缩。 设给出一段报文: CAST CAST SAT AT A TASA 字符集合是 { C, A, S, T },各个字符出现的频度(次数)是 W={ 2, 7, 4, 5 }。 若给每个字符以等长编码 A : 00 T : 10 C : 01 S : 11 则总编码长度为 ( 2+7+4+5 ) * 2 = 36. 若按各个字符出现的概率不同而给予不等长编码,可望减少总编码长度。 因各字符出现的概率为{ 2/18, 7/18, 4/18, 5/18}。 化整为 { 2, 7, 4, 5 },以它们为各叶结点上的权值,建立赫夫曼树。左分支赋 0,右分支赋 1,得赫夫曼编码(变长编码)。 A : 0 T : 10 C : 110 S : 111 它的总编码长度:7*1+5*2+( 2+4 )*3 = 35。比等长编码的情形要短。 总编码长度正好等于 赫夫曼树的带权路径长 度WPL。 赫夫曼编码是一种无 前缀的编码。解码时不会 混淆。 赫夫曼编码树 typedef struct { unsigned int weight; unsigned int parent,lchild,rchild; } HTNode, *HuffmanTree; typedef char **HuffmanCode; void HuffmanCoding(HuffmanTree HT,HuffmanCode HC,int *w, int n) { HuffmanTree p; char *cd; int i,s1,s2,start; unsigned int c,f; if (n=1) return; // n为字符数目,m为结点数目 int m=2*n-1; HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode)); // 0号单元未用 建立赫夫曼树及求赫夫曼编码的算法 (p147算法6.12) for (p=HT, i=1; i=n; ++i,++p,++w) { p-weight = *w; p-parent=0; p-lchild=0;p-rchild=0; } // *W={5,29,7,8,14,23,3,11} // *p = { *w,0,0,0 };
文档评论(0)