第六章二叉树续资料讲解.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
*;*;*;6.3.1 二叉树数组表示法;6.3.1 二叉树数组表示法;创建二叉树结点数据的策略有三个,如下所示: 将第一个要创建的元素插入成为跟结点; 将元素值与结点值进行比较,如果元素值大于结点值,将此元素值送往结点的右子结点,如果右子结点并不是空的,需要重复比较,否则创建结点将元素值插入。 如果元素值小于结点值,将此元素送往结点的左子结点,如果左子结点不是空的,需要重复比较,否则创建结点将元素值插入。 ;实例(二叉查找树): Binary Search Tree;*;*;二叉树的数组表示法可以使用在所有的二叉树。前面例子中的二叉树的空间使用率已经相当理想了,但是对于下面的二叉树,还是按照原来的方法就不理想了。 ;产生的问题与解决方法;6.3.2 二叉树结构数组表示法;二叉树使用的结构声明;上述声明最有一行的结构数组就是存储二叉树的各结点。结点的数据安排是将跟结点放在索引0,字段变量left和right分别指向跟结点左、右子树的索引值,如果没有子树变量left和right为-1. 例如:一颗二叉树和其结构数组表示法,如图所示 ;接着我们从跟结点来看这颗二叉树。结构数据索引0表示这颗树的树根,先从左子树开始其字段left是1,数据索引1表示是其左子结点。 再看右子树,字段right是2,数据索引2是其右子结点即数据索引2,字段left是-1表示没有左子结点 字段right是3表示数据索引3是其右子结点,以此类推,可以跟踪到二叉树的各个叶结点,即字段left和right都是-1;使用结构数组创建二叉树。;*;*;*;输出结果;结构数组表示二叉树优缺点;6.3.3 二叉树链表结构表示法;二叉树使用的基本结构声明, struct tree { int data; struct tree *left; struct tree *right; }; typedef struct tree treenode; typedef treenode *btree; 上述声明的data项是存储二叉树结点的数据,字段left和right分别是指向左、右边子树的结构指针。;*;*;*;*;*;*;输出结果;程序说明 本程序并没有完全输出整个二叉树 函数printbtree()只是使用循环遍历二叉树。 所以显示的只是二叉树的一条分支,而无法输出完整的二叉树结点。 如需完整输出整棵树,就需要借助递归技巧,详细说明请参看下一节二叉树的遍历。;*;线性数据结构的数组??链表都只能从头至尾或从尾至头的遍历。 但是二叉树的遍历就比较复杂 二叉树的每一个结点都可以分成左右两个分支。如果把它视为一张公路图,此时的每个结点都是岔路可以选择往左或往右走。 当然如果结点没有左子树或者右子树,可以视为死路。 现在把问题缩小,无论在哪个结点面对的都是往左或往右的选择,整个遍历过程可以简化成为持续的处理选择,直到没有路可走。 所以二叉树的遍历实际上是一种递归的遍历,但是因为递归函数中调用的排列顺序不,可以分为三种不同的遍历方式,如下 ;中序遍历方式(Inorder Traversal) 中(根)序遍历方式 前序遍历方式(Preorder Traversal) 或称为先(根)序遍历方式 后续遍历方式(Postorder Traversal) 或称为后(根)序遍历方式;6.4.1 中序遍历方式;中序遍历的递归函数如果是inorder(),指针root是二叉树指针,中序遍历的递归步骤如下所示: 1 检查是否可以继续进行,即指针root不等于NULL 2 如果可以继续前进,其处理方式如下: 递归调用inorder(root- left)往左走。 处理目前结点 递归调用inorder(root-right)往右走。 程序实例 7_4_1.c 创建一颗二叉树,使用中序遍历将结点输出。;这个程序创建的二叉树结构图如下(括号内是假设结点内存位置):;6.4.2 前序遍历方式;前序遍历的递归函数如果是perorder(),输入的参数是数指针root是二叉树指针,前序遍历的递归步骤如下所示: 1 检查是否已经到达叶结点,也就是指针root等于NULL 2 如果不是叶结点表示可以继续走,其处理方式如下: 处理目前结点 递归调用preorder(root- left)往左走。 递归调用preorder(root-right)往右走。 上述的操作和中序遍历只是处理结点和递归调用顺序上的差异。 ;程序实例 7_4_2.c 创建一颗二叉树,使用前序遍历将结点输出。 树的结构为: ;6.4.3 后序遍历方式;后序遍历的递归函数如果是postorder(),输入的参数是数指针root是二叉树指针,后序遍历的递归步骤如下所示: 1 检查是否已经到达叶结点,也就是指针root等于NULL

文档评论(0)

yuzongxu123 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档