第7讲 树和二叉树.ppt

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

对于上图所示的二叉树,非递归的二叉树前序遍历算法的执行过程 如下页图所示: 中根序遍历的非递归算法 A B C D E F G p i P-A (1) A B C D E F G p i P-A P-B (2) A B C D E F G p i P-A P-B P-C (3) p=NULL A B C D E F G i P-A P-B 访问:C (4) p A B C D E F G i P-A 访问:C B (5) A B C D E F G i P-A P-D 访问:C B p (6) A B C D E F G i P-A P-D P-E 访问:C B p (7) A B C D E F G i P-A P-D 访问:C B E p (8) A B C D E F G i P-A P-D P-G 访问:C B E P=NULL (9) A B C D E F G i P-A 访问:C B E G D p (11) A B C D E F G i P-A P-F 访问:C B E G D p (12) A B C D E F G i P-A P-D 访问:C B E G p (10) A B C D E F G i P-A 访问:C B E G D F p=NULL (13) A B C D E F G i 访问:C B E G D F A p (14) A B C D E F G i 访问:C B E G D F A p=NULL (15) 7.4 线索二叉树 把结点中指向前驱结点和后继结点的指针称为线索。在二叉树的结点上加上线索的二叉树称作线索二叉树。对二叉树以某种方法(如前序、中序或后序方法)遍历使其变为线索二叉树的过程称作按该方法对二叉树进行的线索化。 二叉树 中序线索二叉树 前序线索二叉树 后序线索二叉树 7.5 树与二叉树的转换 1 树转换为二叉树 树转换为二叉树的方法是: (1)树中所有相同双亲结点的兄弟结点之间加一条连线。 (2)对树中不是双亲结点第一个孩子的结点,只保留新添加的该结点与左兄弟结点之间的连线,删去该结点与双亲结点之间的连线。 (3)整理所有保留的和添加的连线,使每个结点的第一个孩子结点连线位于左孩子指针位置,使每个结点的右兄弟结点连线位于右孩子指针位置。 树转换为二叉树的过程 2 二叉树还原为树 二叉树还原为树的方法是: (1)若某结点是其双亲结点的左孩子,则把该结点的右孩子、右孩子的右孩子……都与该结点的双亲结点用线连起来。 (2)删除原二叉树中所有双亲结点与右孩子结点的连线。 (3)整理所有保留的和添加的连线,使每个结点的所有孩子结点位于相同层次高度。 二叉树还原为树的过程 4 孩子兄弟表示法 孩子兄弟表示法就是用指针既表示出每个结点的孩子结点,也表示出每个结点的兄弟结点。 7.9 树的遍历及应用 树的用法之一就是许多操作系统中的目录结构 如果要列出目录中所有文件的名字,输出格式是:层次为di的文件将在di次跳格(tab)缩进后打印其名 private void listAll(int depth) { printName(depth); //Print the name of the object; if(isDeirectory()) for each file c in this directory (for each child) c.listAll(depth+1);} public void listAll() {listAll(0);} 1 先根遍历 树的先根遍历递归算法为: (1)访问根结点; (2)按照从左到右的次序先根遍历根结点的每一棵子树。 在每个结点上的工作量是常数。如果有N个文件名需要输出,则运行时间就是O(N) 2 后根遍历 树的后根遍历递归算法为: (1)按照从左到右的次序后根遍历根结点的每一棵子树; (2)访问根结点。 例如:计算文件系统某目录下所有文件占用的磁盘区块的总数(由于目录也是文件,也有大小) public int size() { int totalSize=sizeOfThisFile(); if(isDirectory()) for each file c in this directory(for each child) totalSize+=c.size(); return totalSize(); } 先根遍历得到的结点序列为:A B E J F C G K L D H I 后根遍历得到的结点序列为:J E F B K

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档