- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
树与周游算法2010
本讲主要内容 树结构概念 树结构的特点 二叉树概念 二叉树的抽象数据结构实现 树的周游(遍历) 树结构的概念 树结构=层次 + 划分 层次化的语言结构 树的递归定义 定义:树是n( n≥0 )个结点的有限集T,其中: 当n=0时称为空树。有且仅有一个特定的结点,称为树的根(root) 当n1时,其余结点可分为m(m0)个互不相交的有限 T1,T2,……Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree) 特点: 树中各子树是互不相交的集合。 二叉树 二叉树的基本形态 二叉树的特点 可为空。 每个节点最多有两个儿子。(出度=2) 左右兄弟节点间存在序关系。 二叉树的一些数学特性 性质1 在非空二叉树的i层上至多有2i个结点(i≥0)。 20 ? 21 ? 22 … ? 2i 性质2 高度为k的二叉树中最多有2k+1 - 1个结点(k≥0)。 20 + 21 + 22 … + 2i 满二叉树 如果一棵二叉树的任何结点或者是树叶结点,或有两棵非空子树,则此二叉树称作满二叉树。 在满二叉树中,叶结点的个数比分支结点个数多1。 N2 = N0 - 1 完全二叉树 如果一棵二叉树至多只有最下面的两层结点度数可以小于2,其余各层结点度数都必须为2, 并且最下面一层的结点都集中在该层最左边的若干位置上,则此二叉树称为完全二叉树。完全二叉树不一定是满二叉树。 完全二叉树的特性 对于具有n个结点的完全二叉树,如果按照从上(根结点)到下(叶结点)和从左到右的顺序对二叉树中的所有结点从0开始到n-1进行编号,则对于任意的下标为i的结点,有:(1) 如果 i = 0,是根结点。如果i>0,则其父结点的下标为 ?(i-1)/2? ;(2) 如果2i+1 ≤ n-1,则下标为i的结点的左子结点的下标为2i+1;否则,i结点没有左子结点:(3) 如果2i+2 ≤ 1,则下标为i的结点的右子结点的下标为2i+2。否则,i的结点没有右子结点。 二叉树的特点 层次化的线型结构 二维度的的线性表 链接结构二叉树的定义 二叉树的ADT 建立一个空二叉树 BinTree createEmptyTree( void ) { BinTree t = (BinTree)malloc(sizeof(BinTree)); if (t!=NULL) return (t); else printf(Out of space!! \n); return (t); } 建一个带左右子树的二叉树 BinTree consBintree (DataType val, BinTree left, BinTree right) { BinTree root = (BinTree)malloc(sizeof(struct Node)); if (root != NULL) { root-info = val; root-llink = left; root-rlink = right; } else printf(out of space!\n); return root; } 树的周游 周游的定义: 按某一规律系统的访问树中的所有结点,并使 每个结点恰好被访问(visit(p))一次。 周游的方法: 按深度方向(也称按深度优先)和按宽度方向周游(也称按宽度优先)。 二叉树的周游概念 表达式的二叉树表示 表达式树: 图中每个子树对应一个子表达式。子树之间的次序是重要的。由于二叉树本身的层次已经可以定义计算的次序,所以原表达式中的括号不再需要。 应用:(a-b)/(c+d)表示成一棵二叉树 先根 /-ab+cd 前缀表示(波兰式) 后根 ab-cd+/ 后缀表示(逆波兰式) 对称序 a-b / c+d 中缀表示法 表达式树的求值 表达式树的值 = 根节点算符 左子树的值 右子树的值 叶子节点的值是他本身 按深度方向进行树的周游 按深度方向进行树的周游 树结构的搜索 深度优先搜索 一路精进,到头回退 尝试另外可能分支 栈结构与深度优先算法 根节点进栈,同时保存下一分枝标号。 进入下一个分枝 保留分枝根节点及他的下一分枝标号 到叶结点?且没有找到?返回父节点,进入父节点下一个分支的兄弟分枝… 再谈迷宫 算法设计 走一步,记一步。 方向试探 前进 ? push (current) 无法前进 ? current = pop ( ) 关于小球问题环境 作业 课程网站下载。 3号前提交。 继续思考: 旅伴过桥问题。 小球问题。 (请5号前提交) 2 5 2 / 6 4 * + - +
文档评论(0)