- 1、本文档共120页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六章 树与二叉树 6.1 树 一、树的定义和术语 树T——是由n个结点构成的有限集合(n0) , 其中: 有且仅有一个特定的结点,称为树的根(root) 当n1时,其余结点可分为m(m0)个互不相交的有限集T1,T2,……Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree) 特点: 树中至少有一个结点——根 树中各子树是互不相交的集合 树的其他表示嵌套集合、广义表表示、凹入表示 基本术语 结点(node)——表示树中的元素,包括数据项及若干指向其子树的分支。 结点的度(degree)——结点拥有的子树数。 叶子(leaf)——度为0的结点。 孩子(child)——结点子树的根称为该结点的孩子。 双亲(parents)——孩子结点的上层结点。 兄弟(sibling)——同一双亲的孩子。 树的度——一棵树中最大的结点度数。 结点的层次(level)——从根结点算起,根为第一层,它的孩子为第二层……。 深度(depth)——树中结点的最大层次数。 森林(forest)——m(m?0)棵互不相交的树的集合。 6.2 二叉树 一、定义:二叉树是n(n?0)个结点的有限集,它或为空树(n=0),或由一个根结点和两棵分别称为左子树和右子树的互不相交的二叉树构成。 特点 每个结点至多有二棵子树(即不存在度大于2的结点) 二叉树的子树有左、右之分,且其次序不能任意颠倒 基本形态 二叉树性质 性质1:二叉树的第i层至多有2i-1个结点(i≥1)。 几种特殊形式的二叉树 满二叉树 定义:一棵深度为k且有2k –1个结点的二叉树 特点:每一层上的结点数都是最大结点数 性质5:如果对一棵有n个结点的完全二叉树的结点按层序编号,则对任一结点i(1?i?n),有: 如果i=1,则结点i是二叉树的根,无双亲;如果i1,则其双亲是?i/2? ; 如果2in,则结点i无左孩子;如果2i?n,则其左孩子是2i ; 如果2i+1n,则结点i无右孩子;如果2i+1?n,则其右孩子是2i+1 ; 树与二叉树的区别 A.树中结点的最大度数没有限制,二叉树结点最大度数为2。 B.树的结点子树无左、右之分,二叉树的结点子树有明确的左、 右之分。 二、二叉树的存储结构 顺序存储结构 类型定义 typedef ElemType SqBiTree[MAX_TREE_SIZE]; //0号单元存储根结点 1) 依据性质5,用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素;结点在存储区中的相对位置反映它们逻辑上的关系2) 仅适用于完全二叉树 一般二叉树的顺序存储方法通过补虚结点,将一般的二叉树变成完全二叉树空间开销大! 空间利用率问题: 在最坏情况下,一个深度为k且只有k个结点的单支树(树中不存在度为2的结点),则需要长度为2k-1的一维数组。 链式存储结构 二叉链表 6.3 二叉树的遍历和线索二叉树 一、二叉树的遍历 查找某个结点,或对二叉树中全部结点进行某种处理,就需要遍历。 1、遍历定义及遍历算法 遍历是指按某条有哪些信誉好的足球投注网站路线寻访树中每个结点,且每个结点只被访问一次。 按先左后右的原则,一般使用三种遍历: 先序遍历(D L R): 访问根结点,按先序遍历左子树,按先序遍历右子树。 中序遍历(L D R): 按中序遍历左子树,访问根结点,按中序遍历右子树。 后序遍历(L R D): 按后序遍历左子树,按后序遍历右子树,访问根结点。 二叉树为空时,执行空操作,即空二叉树已遍历完。 遍历时的有哪些信誉好的足球投注网站路线 (约定:先左后右,D-根,L-左子树,R-右子树) 先(根)序遍历:1 2 4 5 6 7 3 (DLR) 中(根)序遍历:4 2 6 5 7 1 3 (LDR) 后(根)序遍历:4 6 7 5 2 3 1 (LRD) 层次遍历:1 2 3 4 5 6 7 讨论:如何遍历? (1)如果为空,访问结束 (2)否则,一般结构如下: 假设左右子树均可分别遍历,可采用先序、中序、后序遍历 至于左右子树的遍历,可采用与整个二叉树相同的方式进行:(递归方式) 先序遍历二叉树T: 如果T不空,则 访问根结点 先序遍历左子树 先序遍历右子树 3、求二叉树的高度 方法一: void high(bitree T, int h) { //利用二叉树的后序遍历 if (T==Null) h=0; else{ high( T-lchild, h1); high( T-rchild, h2)
文档评论(0)