- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
(5)单边线索二叉树 从上面的讨论可以看出:线索二叉树中既有指向前驱的左线索,又有指向后继的右线索。如果只保留一边[左或右]线索,便得到单边线索二叉树。 左线索二叉树:只将llink为空的指针修改为指向其前驱的线索,rlink不改动; 右线索二叉树:只将rlink为空的指针修改为指向其后继的线索,llink不改动; 单边线索二叉树应用也非常广泛。 A B D C E G H F I NULL A B D C E G H F I NULL 5.7 树、树林与二叉树的转换 树、树林转换为二叉树 树、树林和二叉树皆可以通过二叉链表作为存储结构,因此借助二叉链表可以实现它们之间的转换。 通过树、树林的孩子- 兄弟表示法得到的二 叉链表作为转换工具。 树对应的二叉树中, 右子树一定为空。 树林对应的二叉树中, 最后一棵树的右子树 必为空。 树转换为二叉树 二叉树转换为树 转换步骤: 在所有相邻的兄弟结点之间加一条线; 对每个非终端结点,只保留它与最左子女的连线,删除它与其它子女的连线; 以根为轴心,将整颗树顺时针旋转45度,使其结构分明。 2. 二叉树转换为树、树林 如某结点为其父母的左子女,则把该结点的右子女, 右子女的右子女,……,都与该结点的父母用虚线连 接起来; 去掉原二叉树中所有父母到右子女的连线; 整理上面得到的树或树林,并将虚线改为实线。 5.8 哈夫曼树及其应用 HaffMan树的定义 扩充二叉树外部路径长度: 其中,Li是从根到第i个外部结点的路径长度, m为外部结点个数 如果所有的外部结点都有一定的加权值,则外部路径长度可以推广为“带权的外部路径长度”: 其中,wi是第i个外部结点的加权值, 其它同上。 HaffMan树的定义 HaffMan算法构造最优二叉树 HaffMan编码 w1 w2 w3 w4 w5 w6 w7 假定有一组实数{w1, w2, …, wm},现在要构造一棵有m个外部结点的扩充二叉树,外部结点的加权值序列为{w1, w2, …, wm},这样的扩充二叉树有许多,带权外部长度WPL最小所对应的扩充二叉树称为“HaffMan树”或“最优二叉树”。 例如:给定权值序列{2, 3, 4, 11},可以构造出不同的扩充 二叉树,并且可以计算出它们的WPL值,其中WPL最小 值所对应的扩充二叉树为HaffMan树。 11 4 2 3 11 4 2 3 11 4 2 3 WPL=1x11+2x4+3x(2+3)=34 WPL=2x3+3x(4+11)+1x2=53 WPL=2x(2+11+3+4)=40 对于扩充二叉树,外部结点个数=内部结点个数+1。 另外,从上面图可以看出,在不同的扩充二叉树中,为了WPL值尽可能小,必须是:加权值较大的外部结点应尽可能地靠近根(路径长度短),这样才能使得总的WPL值降低。 给定一组加权值,有没有一个通用的方法来寻找WPL最小的HaffMan树? 2. HaffMan算法构造最优二叉树 HaffMan最早给出了一种构造最优二叉树的方法,因此称为HaffMan算法: (1) 根据给定的n个权值{w1,w2,…,wn},构成n棵二叉树的集合F={T1,T2,…,Tn},其中每一棵二叉树Ti中只有一个带权为wi的根结点,其左右子树为空。 (2) 在F中选取两棵权值最小的树作为左右子树以构造一棵新的二叉树,且新二叉树的根结点的权值为其左右子树根结点权值之和。 (3) 在F中删除这两棵树,同时将新得到的二叉树加入F中。 (4) 重复(2)和(3),直到F中只含一棵树为止。 11 4 2 3 2 3 5 11 4 2 3 5 4 9 11 2 3 5 4 9 11 20 4棵只有根的二叉树 2、3合并得到3棵二叉树 5、4合并得到2棵二叉树 9、11合并得到1棵二叉树 **** 左右选择不同,得到的HaffMan树形态不同,但WPL相同。 HaffMan树构造的HaffMan算法实现: 存储结构可以有多种,如二叉链表、三叉链表等。下面给出一种顺序结构(一维数组),结点定义: ww: 以该结点为根的子树中所有外部结点的加权和。 parent: 父结点在数组中的存储位置(下标), 根无父,设为-1。 llink: 左孩子存储位置,对于外部结点,无孩子,设为-1。 rlink: 右孩子存储位置,对于外部结点,无孩子,设为-1。 ww parent
文档评论(0)