数据结构及第七讲.ppt

  1. 1、本文档共119页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构及第七讲

二叉树遍历的非递归算法 中序遍历非递归算法 利用栈的后序遍历非递归算法 利用栈的后序遍历非递归算法 利用栈的后序遍历非递归算法 二叉树的计数 练习 练习 栈和二叉树 由于二叉树是递归定义的,所以栈和二叉树之间有着密切的关系。 例子 有0、1、2、3个结点的不同二叉树 计算具有n个结点的不同二叉树的棵数 二叉树的计数: bn = ? 查找最小值 根据二叉查找树的性质——有序性,所以最小值永远位于在根节点左子树的最左侧子节点上 首先,创建一个 Node对象,并且把此对象设置为 BST的根节点。 然后,查看左子节点内的数值是否为空: 如果在左子节点上存在非空节点,则当前节点设置为此节点。继续这样的操作直到找到一个节点的左子节点为空——这就意味着在下面没有更小的数值了,而且已经找到了最小值。 查找最大值 查找最大值和查找最小值类似。 总可以在根节点右子树的最右侧子节点上找到 BST内的最大值。 也就是说,只是在 BST的右子节点上移动而不是在左子节点上移动。 查找节点——Find方法 Find方法用来确定是否在 BST内存储了一个特殊值。 首先,创建一个 Node节点,并且把它设置为 BST的根节点。 然后,会查看关键字(要查找的数据)是否在这个节点内。 如果在,那么这个方法就简单地返回当前节点并且退出。 查找节点——Find方法 如果不在,就把要查找的数据与存储在当前节点内的数据进行比较。 如果关键字小于当前数据值,就把当前节点设置为左子节点。 如果关键字大于当前数据值,就把当前节点设置为右子节点。 如果当前节点为空,那么这个方法的最后一段就会返回空作为方法的返回值,这表明到达 BST的末尾也没有找到关键值。 当 while循环结束的时候,在 current中存储的数值就是要查找的数值。 移除叶子节点 移除叶子过程中,因为不需要考虑子节点的问题,所以是很简单的。 唯一要做的就是把目标节点的父节点的每一个子节点设置为空( null)。 当然,节点始终存在,只是与该节点没有任何连接了。 移除叶子节点——Delete方法 首先,取出要删除的节点。 第一个检测是查看这个节点的左子节点和右子节点是否为空( null)。 然后检测这个节点是否是根节点。 如果是,就把它设置为空( null)。 否则,既把父节点的左子节点设置为空( null)(如果 isLeftChild为真),也把父节点的右子节点设置为空(null)。 删除带有一个子节点的节点 当要删除的节点有一个子节点的时候,需要检查四个条件: 1. 这个节点的子节点可能是左子节点; 2. 这个节点的子节点可能是右子节点; 3. 要删除的这个节点可能是左子节点; 4. 要删除的这个节点可能是右子节点。 删除带有一个子节点的节点 首先,查看右子节点是否为空( null)。 如果是,就接着查看是否在根节点上。 如果在,就把左子节点移动到根节点上。 否则, 如果当前节点是左子节点,那么把新的父节点的左子节点设置为当前的左子节点。 如果在右子节点上,那么把父节点的右子节点设置为当前的右子节点。 删除带有两个子节点的节点 中序后继节点移动到要删除节点的位置上。 首先在原始节点的右子节点上找到后继节点,根据定义这个节点必须比原始节点大。 然后,开始沿着左子节点路径走直到用完节点为止。 既然子树(像一棵树)内的最小值必须是在左子节点路径的末端,沿着这条路径到达末端就会找到大于原始节点的最小节点。 两种特殊情况 后继节点是要删除节点的右子节点 后继节点是要删除节点的左子节点 第一种情况 首先把要删除的节点标记为当前节点。 接着把此节点从其父节点的右子节点中移除,并且把父节点的右子节点指向后继节点。 然后,移除当前节点的左子节点,并且把后继节点的左子节点设置为当前节点的左子节点。 第二种情况 当后继节点是要删除节点的左子节点的情况。执行此操作的算法描述如下: 1.把后继节点的右子节点赋值为后继节点的父节点的左子节点。 2.把要删除节点的右子节点赋值为后继节点的右子节点。 3.从父节点的右子节点中移除当前节点,并且把它指向后继节点。 4.从当前节点中移除当前节点的左子节点,并且把它指向后继节点的左子节点。 线索化二叉树 线索化二叉树 线索化二叉树 例子 寻找当前结点在中序下的前驱 寻找当前结点在中序下的后继 在线索化二叉树中插入一个结点 前序线索化二叉树 后序线索化二叉树 树的存储结构 树的左子女-右兄弟表示 (二叉链表表示) 树的遍历 深度优先遍历 后根次序遍历 当树非空时 依次后根遍历根的各棵 子树 访问根结点 树后根遍历 EFBCGDA 对应二叉树中序遍历 EFBCGDA 树的后根遍历结

您可能关注的文档

文档评论(0)

ipbohn97 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档