- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构6树和二叉树B汇编
本章小结 第6章 树和二叉树( Tree Binary Tree ) 6.3 遍历二叉树和线索二叉树 例2:用二叉树表示算术表达式 特别讨论:若已知先序/后序遍历结果和中序遍历结果,能否“恢复”出二叉树? 【严题集6.31④】 证明:由一棵二叉树的先序序列和中序序列可唯一确定这棵二叉树。 中序遍历:B D C E A F H G后序遍历:D E C B H G F A 问:用二叉链表法(l_child, r_child)存储包含n个结点的二叉树,结点的指针区域中会有多少个空指针? 分析:n个结点的二叉树中,叶子结点有2个空指针,度为1的分支结点有1个空指针。 令n=n0+n1+n2,其中…。 空指针数=n1+2n0=n1+n0+n2+1=n+1(个)。 二、线索二叉树(Threaded Binary Tree) 规 定: 例1:带了两个标志的某先序遍历结果如表所示,请画出对应二叉树。 例2:画出以下二叉树对应的中序线索二叉树。 4.【 2000年计算机系考研题】给定如图所示二叉树T,请画出与其对应的中序线索二叉树。 小结 例:【严题集6.42③】编写递归算法,计算二叉树中叶子结点的数目。 P131:要实现遍历运算必须先把二叉树存入机内。怎样建树? * 1、定义和性质 2、存储结构 3、遍历 4、线索化:线索树 顺序结构 链式结构 二叉链表 三叉链表 先序线索树 中序线索树 后序线索树 树 二叉树 森林 中序遍历 后序遍历 先序遍历 霍夫曼树 霍夫曼编码 6.1 树的基本概念 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林 6.5 赫夫曼树及其应用 (今日授课内容是本章及本课程的重点) 一、遍历二叉树(Traversing Binary Tree) 遍历定义——指按某条搜索路线遍访每个结点且不重复(又称周游)。 遍历用途——它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。 遍历方法——牢记一种约定,对每个结点的查看都是“先左后右” 。 + * A * / E D C B 先序遍历 + * * / A B C D E 前缀表示 中序遍历 A / B * C * D + E 中缀表示 后序遍历 A B / C * D * E + 后缀表示 层序遍历 + * E * D / C A B 遍历的算法实现:用递归形式格外简单! 例:已知一棵二叉树的中序序列和后序序列分别是BDCEAFHG 和 DECBHGFA,请画出这棵二叉树。 分析: ①由后序遍历特征,根结点必在后序序列尾部(即A); ②由中序遍历特征,根结点必在其中间,而且其左部必全部是左子树子孙(即BDCE),其右部必全部是右子树子孙(即FHG); ③继而,根据后序中的DECB子树可确定B为A的左孩子,根据HGF子串可确定F为A的右孩子;以此类推。 (B D C E) ( F H G) A B F (D C E) ( H G) C D E G H A B B F F 思考:二叉链表空间效率这么低,能否利用这些空闲区存放有用的信息或线索? ——我们可以用它来存放当前结点的直接前驱和后继等线索,以加快查找速度。 线 索 化:对二叉树以某种次序遍历使其变为线索二叉树的过程 n+1 普通二叉树只能找到结点的左右孩子信息,而该结点的直接前驱和直接后继只能在遍历过程中获得。 若将遍历后对应的有关前驱和后继预存起来,则从第一个结点开始就能很快“顺藤摸瓜”而遍历整个树了。 两种解决方法 增加两个域:fwd和bwd; 利用空链域(n+1个空链域) 存放前驱指针 存放后继指针 如何预存这类信息? 可能是根、或最左(右)叶子 1)若结点有左子树,则lchild指向其左孩子; 否则, lchild指向其直接前驱(即线索); 2)若结点有右子树,则rchild指向其右孩子; 否则, rchild指向其直接后继(即线索) 。 为了避免混淆,增加两个标志域,如下图所示: rchild RTag data LTag lchild 约定: 当Tag域为0时,表示正常情况; 当Tag域为1时,表示线索情况. B F C H J D I E G A data 1 0 1 0 1 1 1 1 0 0 ltag 1 1 1 0 1 0 1 0 0 0 rtag A G E I D J H C F B A B C G E I D H F root 悬空? 悬空? 解:该二叉树中序遍历结果为: H, D, I, B, E, A, F, C, G 所以添加线索应当按如下路径进行: 为避免悬空态,应增设一个头结点 对应的中序线索二叉树存储结构如图所示:
文档评论(0)