- 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.1 树的基本概念 1.定义:是一种常非线性结构树是n(n≥0)个结点的有限集合。若n=0,则称为空树;否则,有且仅有一个特定的结点被称为根,当n1时,其余结点被分成m(m0)个互不相交的子集T1,T2,...,Tm,每个子集又是一棵树。 2.树的特点 (1)树的根结点没有前驱结点,除根结点之外的所有结点有且只有一个前驱结点 (2)树中所有结点可以有零个或多个后继结点 3.树的相关概念 1) 结点 数据元素的内容及其指向其子树根的分支统称为结点 2) 结点的度 结点的分支数。 3) 终端结点(叶子) 度为0的结点。 4) 非终端结点 度不为0的结点。 5) 结点的层次 树中根结点的层次为1,根结点子树的根为第2层,以此类推。 6) 树的度 树中所有结点度的最大值。 7) 树的深度 树中所有结点层次的最大值。 8) 有序树、无序树 如果树中每棵子树从左向右的排列拥有一定的顺序,不得互换,则称为有序树,否则称为无序树。 9) 森林 是m(m≥0)棵互不相交的树的集合。 在树结构中,结点之间的关系又可以用家族关系描述,定义如下: 10)孩子、双亲 结点子树的根称为这个结点的孩子,而这个结点又被称为孩子的双亲。 11)子孙 以某结点为根的子树中的所有结点都被称为是该结点的子孙。 12)祖先 从根结点到该结点路径上的所有结点。 13)兄弟 同一个双亲的孩子之间互为兄弟。 14)堂兄弟 双亲在同一层的结点互为堂兄弟。 4.树的表示法 直观表示法 嵌套集合表示法 凹入表示法 //不清晰 广义表表示法 6.2 二叉树 1.定义:叉树是n(n≥0)个结点的有限集合。当n=0时,称为空二叉树;当n0时,有且仅有一个结点为二叉树的根,其余结点被分成两个互不相交的子集,一个称为左子集,另一个称为右子集,每个子集又是一个二叉树 2.二叉树的五种形态 3.二叉树的性质 在二叉树的第i层上最多有2i-1个结点(i≥1) 深度为K的二叉树最多有2K-1个结点(K≥1) 对于任意一棵二叉树BT,如果度为0的结点个数为n0,度为2的结点个数为n2,则n0=n2+1 具有n个结点的完全二叉树的深度为 ?log2n?+1 对于有n个结点的完全二叉树中的所有结点按从上到下,从左到右的顺序进行编号,则对任意一个结点i (1≤i≤n),有: 4.二叉树的存储 顺序存储结构 链式存储结构 (1) 顺序存储结构 #define MaxTreeNodeNum 100 typedef struct { DataType data[MaxTreeNodeNum]; /* 根存储在下标为1的数组单元中 */ int n; /* 当前完全二叉树的结点个数 */ }QBTree; (2)链式存储结构 typedef char DataType/* 设结点内容的数据类型为字符型 */ typedef struct bnode { DataType data; struct bnode *lchild, *rchild; } Bnode, *BTree; 6.3 二叉树的遍历 定义:按照一定规则访问二叉树的所有节点一次 (1)先序遍历TLR 若二叉树为空,则结束遍历操作;否则 访问根结点; 先序遍历根的左子树; 先序遍历根的右子树 void PreOrder ( BTree t ) { if ( t ) { visite (t-data); /* 访问结点内容 */ PreOrder ( t-lchild ); /* 遍历左子树 */ PreOrder ( t-rchild ); /* 遍历右子树 */ } } 思考:1. visite 函数能做什么? 2.visite (t-data)这条语句执行次数? 3.如何计算结点个数、叶子个数? 4.改变visite (t-data)这条语句的位置会产生 什么效果? (2)中序遍历和后序遍历算法 (3)三种遍历的非递归算法 1) 先序遍历的非递归算法 2) 中序遍历的非递归算法 将上述算法稍微改动就能写出中序遍历的非递归算法,请读者思考两个算法的差异. 3) 后序遍历的非递归算法 先思考如下问题: *在先序中序遍历中,每个结点(结点地址)进栈几次?出栈几次? *在后序遍历中,每个结点(结点地址)进栈几次?出
文档评论(0)