BiTreebt;a二叉树-西安科技大学精品课程网.PPT

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

第六章 二叉树和树 第六章 二叉树和树 6.1 二叉树 性质5: 对于具有n个结点的完全二叉树,如果按照从上至下和从左到右的顺序对二叉树中的所有结点从1开始顺序编号,则对于任意的序号为i的结点,有: (1) 如果i??1,则序号为i的结点的双亲结点的序号为i/2(“/”表示整除);如果i?=?1,则序号为i的结点是根结点,无双亲结点。 (2) 如果2i≤n,则序号为i的结点的左孩子结点的序号为2i;如果2i>n,则序号为i的结点无左孩子。 (3) 如果2i+1≤n,则序号为i的结点的右孩子结点的序号为2i+1;如果2i+1>n,则序号为i的结点无右孩子。 证明 对于(1),很明显,i?=?1时就是根节点。i>1时,比如结点7,它的双亲是7/2?=?3;结点9,它的双亲是9/2?=?4。 对于(2),比如结点6,因为2?×?6?=?12超过了结点个数10,所以结点6没有左孩子,它是叶子结点;同样结点5,因为2?×?5?=?10没有超过结点个数10,所有它有左孩子,左孩子结点为10。 证明 对于(3),比如结点5,2×5+1=11超过了结点个数10,所以结点5没有右孩子;结点3,2×3+1=7没有超过结点个数10,所以结点3有右孩子,右孩子是结点7。 当然,我们可以用数学归纳法证明。 当i=1时,由完全二叉树的定义知,如果2i=2≤n,说明二叉树中存在两个或两个以上的结点,所以其左孩子存在且序号为2;反之,如果2>n,说明二叉树中不存在序号为2的结点,其左孩子不存在。同理,如果2i+1=3≤n,说明其右孩子存在且序号为3;如果3>n,则二叉树中不存在序号为3的结点,其右孩子不存在。  假设对于序号为j(1≤j<n)的结点,当2j≤n时,其左孩子存在且序号为2j,当2j>n时,其左孩子不存在;当2j+1≤n时,其右孩子存在且序号为2j+1,当2j+1>n时,其右孩子不存在。 当i=j+1时,根据完全二叉树的定义,若其左孩子结点存在,则其左孩子结点的序号一定等于序号为j的结点的右孩子的序号加1,即其左孩子结点的序号等于 (2j+1)+1=2(j+1)=2i,且有2i≤n; 如果2i>n,则左孩子不存在。若右孩子结点存在,则其右孩子结点的序号应等于其左孩子结点的序号加1,即右孩子结点的序号为2i+1,且有2i+1≤n;如果2i+1>n,则右孩子不存在。故性质5的(2)和(3)得证。 由性质5的(2)和(3)我们可以很容易证明性质5的(1)。  当i=1时,显然该结点为根结点,无双亲结点。 当i>1时,设序号为i的结点的双亲结点的序号为m,如果序号为i的结点是其双亲结点的左孩子,根据(2)有i=2m,即m=i/2;如果序号为i的结点是其双亲结点的右孩子,根据(3)有i=2m+1,即m=(i-1)/2=i/2-1/2 综合这两种情况,可以得到,当i??1时,其双亲结点的序号等于i/2。 第23讲 8 void PreInOd(char preod[],char inod[],int i, int j, int k, int h,BiTree *t) 9 { /*以先序序列preod[i..j],中序序列inod[k..h]恢复二叉树*t */ 10 *t=(BiTNode *)malloc(sizeof(BiTNode)); 11 *t-data=preod[i]; 12 m=k; 13 while(inod[m]!=preod[i]) 14 m++; /*在inod[]中查找preod[i] */ 15 if(m==k) 16 *t-lchild=NULL 17 else 18 PreInOd(preod, inod, i+1, i+m-k, k, m-1, t-lchild); 19 if(m= =h) 20 *t-rchild=NULL 21 else 22 PreInOd(preod, inod, i+m-k+1, j, m+1, h, t-rchild); 23 } 25讲 利用“扩展先序遍历序列”创建二叉链表的算法如下: 1 void CreateBiTree(BiTree *bt) 2 { /*先序遍历

文档评论(0)

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

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

1亿VIP精品文档

相关文档