树及其应用【信息技术】.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文档。上传文档
查看更多
树及其应用 Yali 朱全民 什么是树型结构 树形结构是一类重要的非线性数据结构 树中的每个节点X都有唯一的一个前驱节点Y(根节点除外),我们称Y是X的父节点。 树中的每个节点X可能有多个后继节点,我们称这些后继节点是X的子节点。 二叉树 二叉树是一种特殊的树型结构,它的特点是每个节点至多只有两个子节点。 二叉树每个节点的子树有左右之分,其次序不能任意颠倒。 二叉树也有特殊形式,例如满二叉树、完全二叉树等。 例如右图就是一棵二叉树,并且是一棵完全二叉树。 二叉树的存储结构 一般的二叉树存储采用链式的结构: TYPE binary_tree = ^node; node = record data :datatype; // 记录该结点的数据信息 parent, leftchild, rightchild : binary_tree; // 分别记录父结点、左子结点和右子结点 end; 树的存储结构——儿子兄弟表示法(1) 在一棵树中,拥有同一个父结点的结点互称为兄弟。我们不妨假设树中每个结点的子结点是有序的(就像二叉树一样),则我们可以将一棵树这样转化成二叉树: 二叉树中每个结点对应原树的每个结点 对于二叉树中的某个结点 它的左子结点对应原树中该结点的第一个子结点; 它的右子结点对应原树中该结点的下一个兄弟。 树的存储结构——儿子兄弟表示法(3) 这样我们可以类似于二叉树的链式结构写出树的儿子兄弟表示法的存储结构: TYPE tree = ^node; node = record data : datatype; parent, child, brother : tree; // 分别记录父结点、第一个子结点、下一个兄弟结点 end; 树的遍历 树的遍历是指按某种既定顺序不重复不遗漏地访问树中的每一个节点 树的遍历方法有: DFS遍历:按深度优先的顺序遍历树。 BFS遍历:按广度优先的顺序遍历树。 先根遍历:先访问根节点,再依次遍历每棵子树。 后根遍历:先依次遍历每棵子树,再访问根节点。 对于二叉树,遍历的方法还有先序、中序和后序遍历。 树的应用 树结构在解题中应用十分广泛,例如: 利用树的特殊结构进行贪心 合理的遍历树,进行高效率的统计和求值 树型动态规划 …… 例一 树分割 给出一棵有n个节点的树,每个节点上有一个正整数权w(i)。把树分成连通的K个部分(1=K=n),使得权和最小的那部分权和尽量大。 例一 树分割——问题转化 我们考虑这样一个问题: 问题A: 对于一个确定的下界,最多可将树划分为多少棵子树,使得每棵子树的权值和都不小于此下界? 易知,当下界递增的时候,可以最多划分的子树棵数是非递增的。 所以我们可以用二分枚举下界,然后计算问题A,直到找到最大的下界使得问题A的结果不小于K为止。 例一 树分割——子问题的解决 根据树结构的特殊性,我们可以设计出如下的贪心方法: 按照深度由大至小的顺序扫描整棵树,对于扫描到的每个节点,计算以此节点为根的完全子树的权值和,若权值和大于等于给定的下界,则将这个子树划分出来,并将其从原树中删去。直至整棵树所剩部分的权值和小于下界,就将剩余部分归入最后划分的子树之中。最终所得到的一种划分方案即是最优方案。 可以看出,这个算法的时间复杂度是O(N) 例一 树分割——原问题的解决 二分法的时间复杂度是O(logL),其中L是树的权值之和。 整个算法的时间复杂度是O(nlogL) 这样问题的就得到了解决。 这个问题还有一种时间复杂度与权值和L无关的多项式算法,参看贝小辉的论文。 例二 树的最小中心 给一个有n个节点的树,每个节点i上有一个正权w(i),每条边j也有一个正权距离c(j),设计一个线性时间复杂度的算法,找出一个节点u,使得对于所有其他点i,w(i)*L(i,u)的总和最小。其中L(i,u)表示i到u的距离。 例二 树的最小中心 先定义几个函数: Tot(i)——∑w(j)*L(i,j) (1=j=n) S(i)——以i节点为根的子树的节点权和 D(i)——节点i到它父节点的边权值 Sum——整棵树的节点权和 预处理进行一遍深度优先遍历,即可求出Tot(根节点)、S(i)、D(i)和Sum值,时间复杂度是O(N) 例二 树的最小中心 如右图,若我们已经知道了Tot(i),对于它

文档评论(0)

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

1亿VIP精品文档

相关文档