二叉树的存储及遍历.ppt

  1. 1、本文档共65页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
§6.2.3 二叉树的存储结构 §6.3.1 遍历二叉树 §6.3.2 线索二叉树 【内容回顾】 6.1 树的定义和基本术语 6.2 二叉树 -6.2.1 二叉树的定义 -6.2.2 二叉树的性质 【课题导入】 回顾线性表的存储方法? 注意:1)对于一棵二叉树,若采用顺序存储时,对完全二叉树,比较方便;对非完全二叉树,将会浪费大量存储单元。 顺序结构存储二叉树的优点 1)存储时,元素的位置(下标+1)对应其在完全二叉树中的序号。 2)可快速方便地访问元素的双亲和左右孩子。 注意:对于一棵二叉树,若采用二叉链表存储时,当二叉树为非完全二叉树时,比较方便,若为完全二叉树时,将会占用较多存储单元(存放地址的指针)。 若一棵二叉树有n个结点,采用二叉链表作存储结构时,共有2n个指针域,其中只有n-1个指针指向左右孩子,其余n+1个指针为空。 在二叉链表结构中的操作 查询元素? 查询元素的后继? 查询元素的前驱? 从第一层开始,同一层从左到右。 例1:如右图 按层次遍历序列为: ABFCGDEH 特点:先被遍历的结点的孩子先于后遍历的结点的孩子遍历。 根据二叉树的结构,分为三部分: L 左子树 D 根结点 R 右子树 遍历二叉树的方法: 先序遍历 DLR 中序遍历 LDR 后序遍历 LRD 由于其中的左右子树也是二叉树,属于递归结构,所以常常借助递归算法实现。 若二叉树为空,则空操作; 否则, 访问根结点; 先序遍历左子树; 先序遍历右子树。 若二叉树为空,则空操作; 否则, 中序遍历左子树; 访问根结点; 中序遍历右子树。 若二叉树为空,则空操作; 否则, 后序遍历左子树; 后序遍历右子树。 访问根结点; 算法: int NodeCount ( BiTree T ) { if (T ==0 ) return 0; else return 1+NodeCount(T-lchild) +NodeCount(T-rchild); } 算法: int Depth(BiTree T ) { if (T==0 ) return 0; else return 1+max(Depth(T-lchild), Depth(T-rchild)); } 分析:先序序列的第一个是根,这是解题的突破口。 步骤:①先序序列的第一个是根 ②在中序序列中标出根,分成左右子树 ③在先序序列中标出左右子树(根据结点个数即可) ④分别对左右子树的先序和中序序列重复以上步骤直至完成。 例3: 设二叉树的中序序列为BDCEAGHF,后序序列为DECBHGFA,画出此二叉树。 §6.3.2 线索二叉树 何谓线索二叉树? 线索链表的遍历算法 如何建立线索链表? 课堂总结 主要内容:二叉链表存储结构;遍历二叉树的递归算法及其应用,包括:写遍历序列,统计(叶)结点个数,二叉树的深度,根据给定序列画出二叉树等,线索二叉树。 重点难点:遍历二叉树的递归算法及其应用。 L R D L R D L R D □ A □ □ D □ □ C L R D 后序遍历序列:D B C A 例4: 后序遍历 B A D B C □ □ □ □ □ void Postorder ( BiTree T ) { if ( T ) { //如果二叉树不为空 Postorder ( T - lchild ) ; //后序遍历左子树 Postorder ( T - rchild ) ; //后序遍历右子树 printf( T - data) ; //输出根结点 } } 递归算法描述 inorder(B子树); printf (A); inorder(C子树); A B C D E F T 参数T是A结点 (1)调用 inorder(NULL); printf (B);  inorder(D子树); 参数T是B结点 输出B B (2)调用 inorder(NULL); printf (D);  inorder(NULL); 参数T是D结点 输出D D (1)返回 (2)返回 输出A A (3)调用 参数T是C结点 inorder(NULL); printf (C);  inorder(E子树); 输出C C

文档评论(0)

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

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

1亿VIP精品文档

相关文档