- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章非线性数据结构
第四章 非线性数据结构 本章内容 4.1 树 4.2 图 4.1 树 树和二叉树的递归定义、有关术语 二叉树的性质,二叉树的存储结构 二叉树的遍历 树的存储结构 树的遍历 树、森林与二叉树的转换 树的应用 一、树的定义 树的各种表示方法 嵌套集合表示法 凹入表示法 广义表表示法 树叶结点:无后继结点。 分支结点:度大于0的节点。 堂兄弟:其双亲不相同,但其双亲在同一层次的结点互为堂兄弟。 有序树和无序树:如果将树中结点的各子树看成从左到右是有次序的,则称该树为有序树,反之则称为无序树。 森林:是m(m0)棵互不相交的树的集合。 问:具有3个结点的二叉树可能有几种不同形态? (2)二叉树的第i层上至多有2i-1个结点。 证明: 当i=1时,21-1=20=1,结论显然成立。非空二叉树的第1层有且仅有一个结点,即树的根结点。 假设对于第j层(1≤j ≤i-1)结论也成立,即第j层最多有2j-1个结点。 由定义可知,二叉树中每个结点最多只能有两个孩子结点。若第i-1层的每个结点都有两棵非空子树,则第i层的结点数目达到最大,而第i-1层最多有2i-2个结点已由假设证明,于是,应有: 2×2i-2=2i-1 (3) 深度为k的二叉树的结点总数至多为2k-1个 证明:由性质2可知,若深度为k的二叉树的每一层的结点数目都达到各自所在层的最大值,则二叉树的结点总数一定达到最大。即有: 20+21+22+……+2i-1+2k-1=2k-1(等比数列求和) (4) 若一棵二叉树上度为0和度为2的结点数分别为n0和n2,则:n0=n2+1。 推广: n0=n2+2*n3+3*n4+…+(m-1)*nm+1 三叉链表 (4)按层次遍历 先序遍历序列: A,B,D,K,J,G,C,F,I,E,H 中序遍历序列: D,B,G,J,K,A,F,I,E,C,H 后序遍历序列: D,G,J,K,B,E,I,F,H,C,A 按层次遍历序列: A,B,C,D,K,F,H,J,I,G,E 若某完全二叉树采用顺序存储结构,结点存放的次序为A,B,C,D,E,F,G,H,I,J,请给出该二叉树的后序序列。 思考:能否通过遍历序列恢复二叉树呢? 利用前序序列和中序序列恢复二叉树 利用后序序列和中序序列恢复二叉树 利用前序序列和后序序列恢复二叉树 求解:已知前序序列和中序序列求后序序列 已知后序序列和中序序列求前序序列 已知一棵二叉树的前序序列和中序序列,构造该二叉树的过程如下: 1. 根据前序序列的第一个元素建立根结点; 2. 在中序序列中找到该元素,确定根结点的左右子树的中 序序列; 3. 在前序序列中确定左右子树的前序序列; 4. 由左子树的前序序列和中序序列建立左子树; 5. 由右子树的前序序列和中序序列建立右子树。 1、双亲表示法 该表示法要求用一维数组来存储树的有关信息,每个结点对应一个数组元素,它包括两个域:数据域和指针域(parent)。 1、双亲表示法 2、孩子表示法 在该表示法中,每个结点有多个指针域,其中每个指针指向一棵子树的根结点,此时链表中的结点可表示为: 如何确定链表中的结点结构呢? 采用的方法:将所有的孩子结点放在一起,构成线性表。 基本思想是:把每个结点的孩子结点排列起来,构成一个单链表,则n个结点有n个孩子单链表,而n个单链表共有n个头指针,这n个头指针又组成了一个线性表,为了方便采用顺序存储结构。最后,将存放n个头指针的数组存放n个结点的数组结合起来,构成孩子链表的表头数组。 孩子结点的类型定义 struct CNode { int child; CNode *next; } 表头结点的类型定义 struct CBNode { DataType data; CBNode *firstchild; } 3、孩子兄弟表示法 对于某个结点来说,其第一个孩子是唯一的, 其右兄弟结点也是唯一。 实现方法:链表中的每个结点包括三个域: 补充:森林的遍历 先序遍历森林: 访问森林中第一棵树的根结点; 按先序遍历原则遍历第一棵树中根结点的子树森林; 按先序遍历原则遍历其余的树构成的森林 例: 思考:如何将二叉树转换成树或森林 若某结点有左孩子,则将左孩子的右孩子结点、右孩子结点的右孩子结点……都作为该结点的孩子结点,用线相连; 删除原二叉树中所有结
文档评论(0)