《严蔚敏数据结构 (8)》-(课件).ppt

  1. 1、本文档共48页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
6.2.2 二叉树的性质 (3+2) 6.3.2 线索二叉树 为识别复用的两种不同信息,特增加两个标志域: 1. 有关线索二叉树的几个术语: 例:带了两个标志的某先序遍历结果如下表所示,请画出对应的二叉树。 例1:画出以下二叉树对应的中序线索二叉树。 例2:【 00年华中科技大学计算机系考研题】给定如图所示二叉树T,请画出与其对应的中序线索二叉树。 线索二叉树的生成算法(递归算法见教材P134-135) 3. 线索二叉树的遍历(无需堆栈) 附:中序线索二叉树遍历步骤 (算法6.5): 算法流程: * 建树算法: Status CreateBiTree( BiTree T ){ //构造二叉树T scanf(“%c”,ch); if(ch==’ ’)T=NULL; else{ if(!(T=( BiTNode*)malloc(sizeof(BiTNode))))exit(overflow); T-data=ch; //生成根结点 CreateBiTree(T-lchild); //构造左子树 CreateBiTree(T-rchild); //构造右子树 } return OK; } //CreateBiTree 输入序列: A B C ? ? D E ? G ? ? F ? ? ? * 特别讨论:若已知先序(或后序)遍历结果和中序遍历结果,能否“恢复”出二叉树? 例:已知一棵二叉树的中序序列和后序序列分别是BDCEAFHG 和 DECBHGFA,请画出这棵二叉树。 分析: ①由后序遍历特征,根结点必在后序序列尾部(即A); ②由中序遍历特征,根结点必在其中间,而且其左部必全部是左子树的子孙(即BDCE),其右部必全部是右子树的子孙(即FHG); ③继而,根据后序中的DECB子树可确定B为A的左孩子,根据HGF子串可确定F为A的右孩子;以此类推。 【严题集6.31④】 请证明:由一棵二叉树的先序序列和中序序列可唯一确定这棵二叉树。 * 已知中序遍历:B D C E A F H G 已知后序遍历:D E C B H G F A (B D C E) ( F H G) A (D C E) B F G H C D E A B B A C C D C E 详细说明: * 外校考题:试写出如图所示的二叉树按中序遍历时得到的结点序列。 答: LDR:B F J D G K A C H E L I M 04级期末考题:由1001个结点构成的二叉树,何种型态叶子结点最多,何种叶子最少?分别给出叶子结点个数和度为1结点的个数。 答:因为 n=n0+n1+n2 完全二叉树叶子最多----叶子结点501个,度为1结点的个数为0; 单支树的叶子最少----叶子结点个数为1,度为1结点的个数1000 所以, 空指针数目=2n-(n-1)=n+1个。 证明:用二叉链表存储包含n个结点的二叉树,结点必有2n个链域(见二叉链表数据类型说明)。 除根结点外,二叉树中每一个结点有且仅有一个双亲,意即每个结点地址占用了双亲的一个直接后继,n个结点地址共占用了n-1个双亲的指针域。也就是说,只会有n-1个结点的链域存放指针。 Threaded Binary Tree 讨论:用二叉链表法(l_child, r_child)存储包含n个结点的二叉树,结点的指针区域中会有多少个空指针? 有n+1个! 结论:用二叉链表法存储包含n个结点的二叉树,结点的指针区域中会有n+1个空指针。 可以用它来存放当前结点的直接前驱和后继等线索,以加快查找速度。这就是线索二叉树的意义和用途。 疑问1:二叉树是1:2的非线性结构,如何定义其惟一的直接后继? 答:要遍历之后才能得到,且不同遍历算法得到的后继也不同。 先依遍历规则把每个结点对应的前驱或后继线索预存起来,这叫做“线索化”。 疑问2:获得这种“直接前驱”或“直接后继”有何意义? 答:从任一结点出发都能快速找到其前驱和后继,且不必借助堆栈 疑问3:如何经济的(预先)存放这类信息? 答:左孩子/前驱复用,右孩子/后继复用,后者称之为线索 rchild RTag data LTag lchild 约定: 当Tag域为0时,表示正常情况; 当Tag域为1时,表示线索情况. 前驱(后继) 左(右)孩子 各1bit 疑问4:计算机如何识别是孩子指针还是线索指针? 线索链表: 线 索: 线索二叉树: 线 索 化: 用含Tag的结点样式所构成的二叉链表 指向结点前驱和后继的指针 加上线索的二叉树 对二叉树以某种次序遍历使其变为线索二叉树的过程 线索化过程就是在遍

文档评论(0)

花好月圆 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档