网站大量收购闲置独家精品文档,联系QQ:2885784924

数据结构第六章2009.ppt

  1. 1、本文档共113页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构第六章2009

哈夫曼树的构造思想: 权越大的叶子离根越近,则二叉树的带权外部路径长度就越小。 或说权越小的叶子离根越远。 二、如何构造最优二叉树 根据给定的 n 个权值 {w1, w2, …, wn},构造 n 棵二叉树的集合 F = {T1, T2, … , Tn},其中每棵二叉树中均只含一个带权值为 wi 的根结点,其左、右子树为空树; 在 F 中选取其根结点的权值为最小的两棵二叉树,分别作为左、右子树构造一棵新的二叉树,并置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和; 从F中删去这两棵树,同时加入刚生成的新树; 重复 (2) 和 (3) 两步,直至 F 中只含一棵树为止。 例如: 已知权值 W={ 5, 6, 2, 9, 7 } 9 5 6 2 7 5 2 7 6 9 7 6 7 13 9 5 2 7 6 7 13 9 5 2 7 9 5 2 7 16 6 7 13 29 0 0 0 0 1 1 1 1 00 01 10 110 111 构造哈夫曼树算法 ww 外部结点:结点的权 内部结点:ww是以该结点为根的子树中所有外部结点权的总和 ww parent llink rlink parent 表示其父结点的位置,即父结点在数组中的下标值 根结点无父结点,其parent字段为-1 llink,rlink llink, rlink分别为结点的左子女和右子女的位置,用子女在数组中的下标值给出 外部结点无子女,其子女的位置为-1。 哈夫曼树算法采用的数据结构 构造哈夫曼树(续) 哈夫曼树类型: struct HtNode /* 哈夫曼树结点的结构 */ { int ww; int parent,llink,rlink; }; struct HtTree { struct HtNode ht[MAXNODE]; int root; /* 哈夫曼树根在数组中的位置 */ }; typedef struct HtTree *PHtTree;/* 哈夫曼树类型的指针类型 */ 具有m个外部结点的哈夫曼树,根据扩充二叉树的定义,其内部结点为m-1,一共需要2m-1个结点空间 构造哈夫曼树(续) 哈夫曼树的思想 初始化哈夫曼树的数组 令前m个为外部结点,并赋权值 创建m-1个内部结点 申请2m-1大小的存放 哈夫曼树的数组 构造哈夫曼树(续) 创建m-1个内部结点 在集合A找两个最小权 无父结点的结点 构造内部结点 将数组为x1,x2的元素的父结点设 为新生成的内部结点的下标 将新生成的内部结点的权值赋为 权值m1+m2 将新生成的内部结点的左右孩子 指针分别指向m1和m2 设m1,m2纪录最小权值, x1,x2纪录最小权值对应元素的下标 若某结点的权值m1或m2 且父结点为-1 分别将最小权值纪录在m1,m2 并将其对应的数组下标记录在x1,x2 back 构造哈夫曼树的算法 void CreateHuffmanTree(HuffmanTree HT, int *w, int n) { // w存放n个权值(均0),构造赫夫曼树HT if (n=1) return; m = 2 * n - 1; HT.HTree = new HTNode[m+1]; // 为赫夫曼树分配一组顺序空间 for (p=HT.Tree, i=1; i=n; ++i, ++p, ++w) *p = { *w, 0,0,0 }; // n个带权结点形成初始化的森林,每个结点的左、右孩子为空 for ( ; i=m; ++i, ++p) *p = { 0, 0,0, 0 }; // 对尚未使用的结点赋初值 for (i=n; im; ++i) { // 建赫夫曼树 Select(HT.Htree, i-1, s1, s2); // 在HT.Htree[0..i-1]当前可选的结点中选择权值 // 最小的两个结点,其序号分别为s1和s2。 HT[s1].parent = i; HT[s2].parent = i; HT.Htree [i].lchild = s1; HT.Htree[i].rchild = s2; HT.Htree[i].weight = HT.Htree[s1].weight + HT.Htree[s2].weight; // 取左、右子树根结点权值之和 }//for HT.root

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档