- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Data Structures and Algorithms with Java Chapter 8 Binary Trees 为什么使用二叉树 Why Use Binary Trees? 为什么要用到树呢? ∵ 结合了另外两种数据结构的优点:一种是有序数组,另一种是链表。 ∵ 在有序数组中插入数据项太慢 ∵ 在链表中查找太慢 ∵ 在树中查找数据项的速度和在有序数组中查找一样快,并且插入数据项和删除数据项的速度也和链表一样。 在链表中查找太慢 链表的插入和删除都很快,只需要改变引用就可以了,这些操作的时间复杂度为O(1)。 在链表中查找一个数据项,必须从头开始,依次访问链表中的每一个数据项,直到找到该数据项为止。因此需要平均访问N/2个数据项,把每个数据项的值和要找的数据项做比较。这个过程很慢,费时O(N)。 即便是有序链表,也需要从头开始依次访问数据项。 树的术语 Terminology 补充几个概念 结点的度(Degree):结点拥有的子树数 树的度:树内各结点的度的最大值。 树的深度(Depth):树中结点的最大层次 满二叉树: 一棵深度为k且有2k-1个结点的二叉树 完全二叉树:深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应时,称之为完全二叉树。 下面我们要学习的这种二叉树,称为二叉搜索树。 二叉搜索树特征:一个节点的左子节点的关键字值小于这个节点,右子节点的关键字值大于或等于这个父节点。 类比 计算机系统中,人们常遇到的树是分级文件结构。给定设备的根目录(如C:\)是树的根。根目录下面的一层目录是根的子节点。子目录有许多层。文件代表叶节点;他们没有自己的子节点。 显然,分级文件结构不是二叉树,因为一个目录中有多个子节点。 不同的是,分级文件结构中,子目录中不含数据项,只有其他子目录或文件的引用,只有文件中包含数据。 二叉搜索树如何工作 下面我们看看对于一个给定关键字的节点,在一棵普通的二叉树中: 怎么查找一个节点; 怎么插入一个新节点; 怎么遍历树; 怎么删除节点。 节点类 The Node Class 查找节点 Finding a Node 遍历树 Traversing the Tree 遍历树的意思是指根据一种特定顺序访问树的每一个节点。遍历速度不是特别快,往往不及查找、插入和删除节点常用。 有三种简单的方法遍历树,它们分别为:前序 preorder,中序inorder和后序postorder。二叉搜索树最常用的方法是中序遍历。 中序遍历 INORDER TRAVERSAL 中序遍历二叉搜索树会使所有的节点按关键字值升序被访问到。可以通过此方法创建有序的数据序列。 利用递归实现中序遍历,需要做三步操作: 调用自身来遍历节点的左子树; 访问这个节点 调用自身来遍历节点的右子树。 访问一个节点意味着对该节点做某种操作:显示节点,把节点写入文件,或其他别的操作。 删除节点 Deleting a Node 删除节点是二叉搜索树中常用的一般操作中最复杂的。 删除节点要从查找要删的节点开始入手,找到节点后 可能会有三种情况需要考虑: 该节点是叶节点(没有子节点) 该节点有一个子节点 该节点有两个字节点 情况一:删除没有子节点的节点 — 叶节点 删除没有子节点的节点的Java代码 情况二: 删除有一个子节点的节点 后继结点是delNode的右子节点 后继节点是delNode右子节点的左后代 用数组表示树 上面的示例代码基于这样的思想,树的边由每个节点的leftChild和rightChild字段中的引用表示。但是,还有一种完全不同的方法来表示树:用数组。 用数组的方法时,节点存在数组中,而不是由引用相连。节点在数组中的位置对应于它在树中的位置。下标为0的节点是根,下标为1的节点是根的左子树,依此类推,按从左到右的顺序存储树的每一层。 如下图 重复关键字 Insert()方法的代码中,有重复关键字的节点都被插入到与它关键字相同的节点的右子节点处。 问题是find()方法只能找到两个或多个相同关键字节点中的第一个。可以修改find()方法来查找更多的关键字,但很明显耗时。 一种选择是,禁止重复关键字出现。如员工代号。 完整的tree.java程序 在查找的过程中,需要访问每层的一个节点。所以只要知道有多少层就可以知道这些操作需要多长时间了。给定数量节点所需要的层数: N L 对于树中的这些操作 时间复杂度大约为log(N) 在有1000,000个数据项的无序数组或链表中,查找数据项平均会比较500,000次,但在有1000,000个节点的树中,只需要20(或更少)次的比较。 有
原创力文档


文档评论(0)