树和二叉树概要.ppt

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

第6章 树和二叉树 二叉树的性质 性质1: 在二叉树的第i层上至多有2i-1个结点(i=1)。 采用归纳法证明此性质。 当i=1时,只有一个根结点,21-1=20 =1,命题成立。 现在假定对所有的i=k,命题成立,即第k层上至多有2k-1个结点,那么可以证明i=k+1时命题也成立。由归纳假设可知,第k层上至多有2k-1个结点。 由于二叉树每个结点的度最大为2,故在第k+1层上最大结点数为第k层上最大结点数的二倍, 即2×2k-1=2k+1-1。 命题得到证明。 性质2:深度为k的二叉树至多有2k-1个结点(k=1). 深度为k的二叉树的最大的结点数为二叉树中每层上的最大结点数之和,由性质1得到每层上的最大结点数为2i-1 完全二叉树的特点是: (1)所有的叶结点都出现在第k层或k-1层。 (2)对任一结点,如果其右子树的最大层次为L,则其左子树的最大层次为L或L+1。 性质4:具有n个结点的完全二叉树的深度为[log2n]+1。 符号【x】表示不大于x的最大整数(下取整)。 假设此二叉树的深度为k,则根据性质2及完全二叉树的定义得到:2k-1-1n=2k-1 或 2k-1=n2k 取对数得到:k-1=log2nk 因为k是整数。所以有: k=【log2n】+1。 性质5: 如果对一棵有n个结点的完全二叉树的结点按层序编号(从第1层到第【log2n】+1层,每层从左到右),则对任一结点i(1=i=n),有: 如果i=1,则结点i无双亲,是二叉树的根; 如果i1,则其双亲是结点【i/2】。 如果2in,则结点i为叶子结点,无左孩子;否则,其左孩子是结点2i。 如果2i+1n,则结点i无右孩子;否则,其右孩子是结点2i+1。 可以从(2)和(3)推出(1),所以先证明(2)和(3)。 对于i=1,由完全二叉树的定义,其左孩子是结点2,若2n,即不存在结点2,此时,结点i无孩子;结点i的右孩子也只能是结点3,若结点3不存在,即3n,此时结点i无右孩子。 对于i1,可分为两种情况: (1)设第k(1=k=[log2n])层的第一个结点的编号为i,由二叉树的性质2和定义知i=2k-1 结点i的左孩子必定为的k+1层的第一个结点,其编号为2k=2×2k-1=2i。如果2in,则无左孩子: 其右孩子必定为第k+1层的第二个结点,编号为2i+1。若2i+1n,则无右孩子。 (2)假设第k(1=k=[log2n])层上的某个结点编号为i(2k-1=i=2k-1),且2i+1n,其左孩子为2i,右孩子为2i+1,则编号为i+1的结点为编号为i的结点的右兄弟或堂兄弟。若它有左孩子,则其编号必定为2i+2=2×(i+1):若它有右孩子,则其编号必定为2i+3=2×(i+1)+1。 当i=1时,就是根,因此无双亲,当i1时,如果i为左孩子,即2×[i/2]=i,则[i/2]是i的双亲;如果i为右孩子,i=2p+1,i的双亲应为p,p=(i-1)/2=[i/2]. 证毕。 设有n种字符,每种字符出现的次数为Wi , 其编码长度为Li (i=1,2,...n), 则整个电文总长度为∑ Wi Li , 要得到最短的电文,即使得∑ Wi Li最小。 也就是以字符出现的次数为权值,构造一棵 Huffman树,并规定左分支编码位0,右分支编码为1,则字符的编码就是从根到该字符所在的叶结点的路径上的分支编号序列。 用构造Huffman树编出来的码,称为Huffman编码。 为了获得传送电文的最短长度,可将字符出现的次数(频率)作为权值赋予该结点,构造一棵WPL最小的哈夫曼树,由此得到的二进制前缀编码就是最优前缀编码,也称哈夫曼编码。可以验证,用这样的编码传送电文可使总长最短。 图6-22 哈夫曼编码 图6-23 最优编码示例 void InThreading(BiTThrTree p) { if (p) { InThreading(p-lchild); / /左子树线索化 if (!p-lchild) /*前驱线索*/ {p-LTag=Thread; p-lchild=pre;} //前驱线索 if (!pre-rchild) //后继线索 {pre-RTag=Thread; pre-rchild=p;}/

文档评论(0)

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

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

1亿VIP精品文档

相关文档