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

第5章 树和二叉要点.ppt

  1. 1、本文档共103页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.4.4 树和森林的遍历 2.森林的两种遍历方法 按照森林和树相互递归的定义,可以推出森林的两种遍历方法: 1)先序遍历森林 若森林非空,则 (1)访问森林中第一棵树的根结点; (2)先序遍历第一棵树的根结点的子树森林; (3)先序遍历除去第一棵树之后剩余的树构成的森林。 即依次从左至右对森林中的每一棵树进行先根遍历。 2)中序遍历森林 若森林非空,则 (1)中序遍历第一棵树的根结点的子树森林; (2)访问森林中第一棵树的根结点; (3)中序遍历除去第一棵树之后剩余的树构成的森林。 即依次从左至右对森林中的每一棵树进行后根遍历。 5.4.4 树和森林的遍历 若对图5.16中森林进行先序遍历和中序遍历,则分别得到森林的先序序列为: A B C D E F G H I J 中序序列为: B C D A F E H J I G 根据森林与二叉树的转换关系以及森林和二叉树的遍历定义可以推出,森林的先序和中序遍历与所转换后对应的二叉树的先序和中序遍历结果相同。 5.5 哈夫曼树 5.5.1 哈夫曼树的基本概念 哈夫曼(Huffman)树,又称为最优二叉树,是一类带权路径长度最短的树,有着广泛的应用。 首先介绍路径和路径长度的概念。从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径,路径上的分支数目称为路径长度。树的路径长度从树根到每一个结点的路径长度之和。 若将上述概念推广到一般情况,考虑带权的结点。结点的带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度为树中所有叶子结点的带权路径长度之和,通常记作 。其中 为第k个叶结点的权值, 为第k个叶结点的路径长度。 5.5.1 哈夫曼树的基本概念 一般来说,用n(n1)个带权值的叶子结点来构造二叉树,限定树中除了这n个叶子外只能出现度为2的结点,那么,符合这样条件的二叉树往往可以构造出许多棵,其中带权路径长度最小的二叉树就称为哈夫曼树或最优二叉树。 例如,图5.18所示的3棵二叉树都没有度为1的结点,并且都含有5个叶子结点A、B、C、D、E,分别带权值28、10、20、7、35,3棵树的带权路径长度分别为: (a)WPL=28×3+10×3+20×3+7×3+35×1=230 (b)WPL=28×2+10×4+20×3+7×4+35×1=219 (c)WPL=28×2+10×3+20×2+7×3+35×2=217 其中以(c)树的WPL最小。可以验证,它恰好是哈夫曼树。 5.5.1 哈夫曼树的基本概念 图5.18 具有不同带权路径长度的二叉树 5.5 哈夫曼树 5.5.2 哈夫曼树的构造方法 由相同权值的一组叶子结点所构成的二叉树有不同的形态和不同的带权路径长度,那么如何找到带权路径长度最小的二叉树(即哈夫曼树)呢?根据哈夫曼树的定义,一棵二叉树要使其WPL值最小,必须使权值越大的叶结点越靠近根结点,而权值越小的叶结点越远离根结点。哈夫曼依据这一特点提出了一种方法,基本思想如下。 (1)根据给定的n个权值{ w1,w2 ,…,wn }构造n棵只有一个叶结点的二叉树,从而得到一个二叉树的集合F={T1, T2, …, Tn}; (2)在F中选取根结点的权值最小和次小的两棵二叉树作为左、右子树构造一棵新的二叉树,这棵新的二叉树根结点的权值为其左、右子树根结点权值之和; (3)在集合F中删除作为左、右子树的两棵二叉树,并将新建的二叉树加入到集合F中; (4)重复(2)、(3),直到F只含有一棵二叉树为止,这棵二叉树便是要建立的哈夫曼树。 5.5.2 哈夫曼树的构造方法 图5.19展示了图5.18(c)的哈夫曼树的构造过程。其中,根结点上标注的数字是所赋的权。 图5.19 哈夫曼树的构造过程 5.5.2 哈夫曼树的构造方法 在构造哈夫曼树时,可以设置一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n?1个结点,所以数组HuffNode的大小设置为2n-1,数组元素的结构形式如下: 其中,weight域保存结点的权值,lchild和rchild域分别保存该结点的左、右孩子结点在数组HuffNode中的序号,从而建立起结点之间的关系。为了判定一个结点是否已加入到要建立的哈夫曼树中,可通过parent域的值来确定。初始时parent的值为?1,当结点加入到树中时,该结点parent的值为其双亲结点在数组HuffNode中的序号,就不会是-1了。 构造哈夫曼树时,首先将由n个字符形成的n个叶结点存放到数组HuffNode的前n个分量中,然后根据前面介绍的哈

文档评论(0)

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

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

1亿VIP精品文档

相关文档