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

6.3二叉树的遍历.ppt

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

说明 访问函数的示例和preOrder函数调用的方法算法6.1所示. 同理可以实现中序遍历二叉树和后序遍历二叉树. 3种遍历思想一致,不同之处在于访问根结点的时机 先序:访问左子树之前访问根 中序:访问右子树之前访问根 后序:访问右子树之后访问根 四、用堆栈实现二叉树中序遍历 用堆栈实现二叉树中序遍历的规律 将根结点设置为待入栈结点p 如果p不为空,则p入栈,将p的左孩子设置为待入栈结点 如果p为空,则栈顶元素出栈,访问栈顶元素,然后将栈顶元素的右孩子设置为待入栈结点 直到P为空且栈为空结束 算法见书上6.3 2、建立二叉树的存储结构 不同的定义方法相应有不同的存储结构的建立算法 作业: 1.写出中序遍历二叉树的递归算法 2.写出计算二叉树叶结点个数的递归算法 叶结点满足的条件 3.给定二叉树的两种遍历序列,分别是: 前序遍历序列:D,A,C,E,B,H,F,G,I; 中序遍历序列:D,C,B,E,H,A,G,I,F,试画出二叉树,并写出该二叉树的前序遍历序列和中序遍历序列。 6.5 线索二叉树 何谓线索二叉树? 线索链表的遍历算法 如何建立线索链表? 例:画出以下二叉树对应的中序线索二叉树。 小结 7.4 二叉树遍历 7.4.1 二叉树遍历 7.4.2 二叉链存储结构下二叉树遍历的实现 7.5 线索二叉树 1.有关线索二叉树的几个术语 2. 线索二叉树的生成——线索化 作业:给定如图所示二叉树T,请画出与其对应的中序线索二叉树。 后续内容 6.4树与二叉树的转换 6.6哈夫曼树 ——如何记录树中每个结点在遍历序列中直接前驱和直接后继 因为:用二叉链表法存储包含n个结点的二叉树,结点的指针区域中会有n+1个空指针。 可以利用这些空指针来指示前驱或后继 指向该线性序列中的“前驱”和 “后继” 的指针,称作“线索” 与其相应的二叉树,称作 “线索二叉树” 包含 “线索” 的存储结构,称作 “线索链表” A B C D E F G H K ^ D ^ C ^ ^ B E ^ 对线索链表中结点的约定: 在二叉链表的结点中增加两个标志域(bit), ltag(左)和rtag(右)并作如下规定: 若该结点的左子树不空, 则Lchild域的指针指向其左子树, 且设置ltag的值为“0”; 否则,Lchild域的指针指向其“前驱”, 且设置ltag的值为“1” 。 若该结点的右子树不空, 则rchild域的指针指向其右子树, 且设置rtag的值为 “0”; 否则,rchild域的指针指向其“后继”, 且设置rtag的值为“1”。 如此定义的二叉树的存储结构称作“线索链表”。 增加了前驱和后继等线索有什么好处? ——能方便找出当前结点的前驱和后继,不用堆栈(递归)也能遍历整个树。 A B C G E I D H F root 悬空? NULL 悬空? NULL 对该二叉树中序遍历的结果为: H, D, I, B, E, A, F, C, G 所以添加线索应当按如下路径进行: 为避免悬空态,应增设一个头结点 线索二叉树的生成——线索化过程 线索化过程就是在遍历过程中修改空指针的过程 0 0 A 0 0 C 0 0 B 1 1 E 1 1 F 1 1 G 0 0 D 1 1 I 1 1 H 注:此图中序遍历结果为: H, D, I, B, E, A, F, C, G 0 root 1 对应的中序线索二叉树存储结构如图所示: typedef struct BiThrNode { TElemType data; struct BiThrNode *lchild, *rchild; // 左右指针 PointerTag LTag, RTag; // 左右标志 } BiThrNode, *BiThrTree; 线索链表的类型描述: typedef enum { Link, Thread } PointerTag; // Link==0:指针,Thread==1:线索 二、线索链表的遍历算法: 由于在线索链表中添加了遍历中得到的“前驱”和“后继”的信息,从而简化了遍历的算法。 例如: 对中序线索化链表的遍历算法 ※ 中序遍历的第一个结点 ? ※ 在中序线索化链表中结点的后继 ? 根结点的左子树上处于“最左下”(没有左子树)的结点。 若无右子树,则为后继线索所指结点; 否则为对其右子树进行中序遍历时访问的第一个结点。 void InOrderTraverse_Thr(BiThrTree T,

文档评论(0)

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

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

1亿VIP精品文档

相关文档