- 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章-树.ppt
第六章 树 6.1 树的定义 定义 定义:树(tree)是n(n=0)个结点的有限集T,其中: n=0 则称为空树。 当n0时,有且仅有一个特定的结点,称为树的根(root) 当n1时,其余结点可分为m(m0)个互不相交的有限集T1,T2,……Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree) 基本术语 结点(node)——表示树中的元素,包括数据元素及若干指向其子树的分支 结点的度(degree)——结点拥有的子树数 叶子(leaf)——度为0的结点 孩子(child)——结点子树的根称为该结点的孩子 双亲(parents)——孩子结点的上层结点叫该结点的~ 兄弟(sibling)——同一双亲的孩子 树的度——一棵树中最大的结点度数 结点的层次(level)——从根结点算起,根为第一层,它的孩子为第二层…… 深度(depth)——树中结点的最大层次数 森林(forest)——m(m?0)棵互不相交的树的集合 6.2 二叉树 6.2.1 二叉树的定义 6.2.2 二叉树的性质 6.2.3 二叉树的存储结构 6.2 二叉树 6.2.1 二叉树的定义 定义:二叉树是n(n?0)个结点的有限集,它或为空树(n=0),或由一个根结点和两棵分别称为左子树和右子树的互不相交的二叉树构成。 特点 每个结点至多有二棵子树 二叉树的子树有左、右之分,且其次序不能任意颠倒 基本形态 6.2.2 二叉树的性质 性质1:在二叉树的第i层上至多有2i-1个节点(i≥1) 6.2.2 二叉树的性质 几种特殊形式的二叉树 满二叉树 定义: 性质5:如果对一棵有n个结点的完全二叉树的结点按层序编号,则对任一结点i(1?i?n),有: (1) 如果i=1,则结点i是二叉树的根,无双亲;如果i1,则其双亲是?i/2? (2) 如果2in,则结点i无左孩子;如果2i?n,则其左孩子是2i (3) 如果2i+1n,则结点i无右孩子;如果2i+1?n,则其右孩子是2i+1 证明: 可以从(2)和(3)推出(1),先证明(2)和(3)。 科学归纳法: 对于i=1,其左孩子是结点2,若2n,即不存在结点2,此时,结点i无孩子。结点i的右孩子是结点3,若结点3不存在,即3n,此时结点i无右孩子。即i=1,结论成立。 对于i1,可分为两种情况: (1)设第j层的第一个结点的编号为i,由二叉树的性质2和定义知i=2j-1 结点i的左孩子必定为的j+1层的第一个结点,其编号为2j=2×2j-1=2i。如果2in,则无左孩子。 结点i右孩子必定为第j+1层的第二个结点,编号为2i+1。若2i+1n,则无右孩子。 (2)假设第j层上的某个结点编号为i(2j-1=i=2j-1),且2i+1n,其左孩子为2i,右孩子为2i+1。则编号为i+1的结点是编号为i的结点的右兄弟或堂兄弟。若它有左孩子,则其编号必定为2i+2=2×(i+1):若它有右孩子,则其编号必定为2i+3=2×(i+1)+1。 证毕 二叉树的存储结构 顺序存储结构 实现:按满二叉树的结点层次编号,依次存放二叉树中的数据元素 特点: 结点间关系蕴含在其存储位置中 浪费空间,适于存满二叉树和完全二叉树 (比如深度为k的右单支树,需要2k-1个结点,有效结点为k) 链式存储结构 二叉链表 先左后右的遍历算法(左子树总是先于右子树) 说明: 由一棵给定的二叉树可以获得三种遍历序列,同样,也可以由这些遍历序列来重新构造二叉树。 单用一个遍历序列是无法构造二叉树的,因为无法从遍历序列中区分二叉树的左、右子树。 利用中序遍历序列,并结合先序遍历序列或后序遍历序列就能重新构造二叉树。 本章实验内容 编写一个程序,输入先序遍历序列和中序遍历序列 ,由先序遍历和中序遍历序列构造出一棵二叉树,然后用后序遍历输出该二叉树。 先序遍历序列和中序遍历序列的结点分布特点: 先序遍历序列: 根左子树上所有结点右子树上所有结点 中序遍历序列: 左子树上所有结点根右子树上所有结点 二叉树的构造步骤: 1)从先序遍历序列中取出第一个结点,该结点一定是二叉树的根。然后在中序遍历序列中找到根结点,根结点前面的结点序列就是左子树的中序遍历序列,根结点后面的结点序列就是右子树的中序遍历序列。 2)对根的左子树先序遍历序列和中序遍历序列及右子树的先序遍历序列和中序遍历序列,再执行第一步,直到得出所有叶子结点为止。 main() { 输入先序序列=preod[] 输入中序序列=inod[] PreInOd(preod,1,n,inod,1,n,root); }
原创力文档


文档评论(0)