二叉查找树

二叉查找树(二)

∥☆過路亽.° 提交于 2019-12-09 11:24:48
  在上一篇中,我们说到了二叉树的性质,存储以及定义的结点,有了这些之后,我们便可以来创建一棵二叉查找树了。   首先,我们知道,按照我们定义的存储结构,如果我们知道了整棵树的根结点,那么我们就可以访问到整棵树的所有结点了,因此,将二叉树的类写成如下形式: 1 /** 2 * 二叉查找树 3 * @author Alfred 4 */ 5 public class BSTree { 6 //随机化的构造二叉查找树 7 private Random rand = null; 8 //根结点 9 private TreeNode rootNode = null; 10 11 /** 12 * 以int数组A来创建二叉查找树 13 * @param A int数组 14 */ 15 public BSTree(int[] A){ 16 rand = new Random(); 17 createBSTree(A); 18 } 19 20 /** 21 * 创建二叉查找树 22 * @param A int数组 23 */ 24 private void createBSTree(int[] A){} 25 }   代码里边包含一个Random类的对象(这个对象时我自己加上去的,可以没有,原因之后解释)和一个根结点,我们假设用一个整数的数组来创建一棵二叉查找树。我们知道

哈希 二叉树

故事扮演 提交于 2019-12-06 07:00:49
我们在散列表那节中讲过,散列表的插入、删除、查找操作的时间复杂度可以做到常量级的 O(1),非常高效。而二叉查找树在比较平衡的情况下,插入、删除、查找操作时间复杂度才是 O(logn),相对散列表,好像并没有什么优势,那我们为什么还要用二叉查找树呢? 我认为有下面几个原因: 第一,散列表中的数据是无序存储的,如果要输出有序的数据,需要先进行排序。而对于二叉查找树来说,我们只需要中序遍历,就可以在 O(n) 的时间复杂度内,输出有序的数据序列。 第二,散列表扩容耗时很多,而且当遇到散列冲突时,性能不稳定,尽管二叉查找树的性能不稳定,但是在工程中,我们最常用的平衡二叉查找树的性能非常稳定,时间复杂度稳定在 O(logn)。 第三,笼统地来说,尽管散列表的查找等操作的时间复杂度是常量级的,但因为哈希冲突的存在,这个常量不一定比 logn 小,所以实际的查找速度可能不一定比 O(logn) 快。加上哈希函数的耗时,也不一定就比平衡二叉查找树的效率高。 第四,散列表的构造比二叉查找树要复杂,需要考虑的东西很多。比如散列函数的设计、冲突解决办法、扩容、缩容等。平衡二叉查找树只需要考虑平衡性这一个问题,而且这个问题的解决方案比较成熟、固定。 最后,为了避免过多的散列冲突,散列表装载因子不能太大,特别是基于开放寻址法解决冲突的散列表,不然会浪费一定的存储空间。 综合这几点

MySQL用B+树做索引

非 Y 不嫁゛ 提交于 2019-12-05 03:15:26
索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。 索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。 索引最形象的比喻就是图书的目录了。注意这里的大量,数据量大了索引才显得有意义,如果我想要在[1,2,3,4]中找到4这个数据,直接对全数据检索也很快,没有必要费力气建索引再去查找。索引在mysql数据库中分三类: B+树索引、Hash索引、全文索引 我们今天要介绍的是工作开发中最常接触到innodb存储引擎中的的B+树索引。 要介绍B+树索引,就不得不提二叉查找树,平衡二叉树和B树这三种数据结构。B+树就是从他们仨演化来的。 二叉查找树 首先,让我们先看一张图  从图中可以看到,我们为user表(用户信息表)建立了一个二叉查找树的索引。图中的圆为二叉查找树的节点,节点中存储了键(key)和数据(data)。 键对应user表中的id,数据对应user表中的行数据。二叉查找树的特点就是 任何节点的左子节点的键值都小于当前节点的键值,右子节点的键值都大于当前节点的键值。 顶端的节点我们称为根节点,没有子节点的节点我们称之为叶节点。 如果我们需要查找id=12的用户信息,利用我们创建的二叉查找树索引,查找流程如下: 1.

20182333 2019-2020-1 《数据结构与面向对象程序设计》第九周学习总结

大城市里の小女人 提交于 2019-12-05 00:31:50
20182333 2019-2020-1 《数据结构与面向对象程序设计》第九周学习总结 教材学习内容总结 第十六章 树 树 1.树是非线性结构,其元素组织为一个层次结构 2.树的度表示树中的任意结点的最大子结点数 3.有m个元素的平衡n叉树的高度是lognm 4.树的遍历有4种方法 5.进行层序遍历时可采用队列来储存树中的元素 6.使用数组实现二叉树时,位于位置n的元素的左孩子在(2n+1)的位置,其右孩子在(2*(n+1))的位置 7.树的基于数组的存储链实现方式可以占数组中的连续位置,不管树是不是完全树 8.如何在一般二叉树中添加及删除元素,要取决于树的用途 9.使用决策树可以设计专家系统 二叉树 1.二叉查找树时一颗二叉树,对于其中的每个结点,左子树上的元素小于父结点的值,二右子树上的元素大于等于父结点的值 2.如果没有其他的操作,二叉查找树的树形由元素的添加次序来决定 3.最有效地二叉查找树时平衡的,所以每次比较时可以排除一半的元素 4.当从二叉查找树中删除元素时要考虑三种情形,其中的两种比较简单 5.当从二叉查找树中删除有两个子结点的结点时,比较好的办法是用它的中序后继来取代它 6.可以对二叉查找树进行旋转以恢复平衡 部分计算公式 1.二叉树上第i层上的结点数目最多为2^(i-1)(i>=1) 2.深度为k的二叉树至多有2^k-1个结点(i>=1) 3

20182301 2019-2020-1 《数据结构与面向对象程序设计》第9周学习总结

Deadly 提交于 2019-12-05 00:26:35
20182301 2019-2020-1 《数据结构与面向对象程序设计》第9周学习总结 教材学习内容总结 第十六章 树的定义 根节点:唯一 节点的度:节点拥有的子树数。度为0:称为终端节点或叶节点 树的度:树内各节点的度的最大值 内部节点:除根节点外的节点 孩子(child):节点的子树的根 称为该节点的孩子,反过来,称为双亲(parent) 兄弟(sibling):同一双亲的孩子之间的关系 节点的祖先:从根到该节点所经分支上的全部节点 节点层次:根为第一层,根的孩子为第二层 树的深度(Depth):树中节点的最大层次 森林(Forest):是m(m>0)棵互不相交的树的集合 树的分类 满二叉树 如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。 如果一个二叉树的层数为K,且结点总数是(2^k) -1,则它就是满二叉树。 完全二叉树 它是由满二叉树而引出来的。 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边, 线索二叉树 n个结点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域(就是用于指向左右孩子的域)。 利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")。 加上线索的二叉树称为线索二叉树。 哈夫曼树(霍夫曼树)又称为最优树

20182322 2019-2020-1 《数据结构与面向对象程序设计》第9周学习总结

点点圈 提交于 2019-12-05 00:08:29
教材第16章学习内容总结 本章的内容主要讲树,顾名思义树与队列、栈、列表最大的区别就在于,树是一种非线性结构,其元素是一种层次结构存放。 树: 用于描述树相关的术语有非常多,除了之前常用的结点(node)还有边(edge)、孩子、兄弟等等,其中我认为比较重要的有: 内部节点:非根节点,且至少有一个子结点 同胞节点:属于同一节点的子结点 叶节点:不包含任何子节点的结点 树的分类:可以有非常多的分类方式,但是最重要的标准是任一结点可以具有的最大孩子数目,成为度(order),n元树的定义也是由此定义的 树的数组实现:因为数组实现树比较麻烦,所以在树的数组实现中书上同样模拟了链接策略,如图所示。 树的遍历, 前序遍历:从根节点开始访问每一个节点及其孩子。如图: 中序遍历:从根节点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历根节点的右子树。如图: 后序遍历:从左到右先叶子后节点的方式遍历访问左右子树,最后访问根节点。如图: 层序遍历:从树的第一层,也就是根节点开始访问,从上到下逐层遍历,在同一层中,按从左到右的顺序结点逐个访问。如图: 二叉树 (二叉树极其重要,以至于用三级标题来写它,而不是一般的一个点。)二叉树又名二元树,它的每一个结点最多具有两个孩子结点。 二叉树 (二叉树极其重要,以至于用三级标题来写它,而不是一般的一个点。)二叉树又名二元树

基于数组的二叉查找树 Binary Search Tree (Java实现)

帅比萌擦擦* 提交于 2019-12-04 08:30:18
二叉查找树 二叉查找树是一种支持动态查询的数据结构,所谓动态查寻结构:即在当数据集合内容发生改变时,集合内数据的排列组合不用重新构建。这样的数据结构在查询时需要不断变动的场景中是非常高效的,二叉查找树就是其中一个,并且它是 SBT , AVL , 红黑树 的基础,一直有兴趣想要研究下。原理就不介绍了, 可参考这个 。今天花了半天时间,自己完成了一个基于数组的Java实现。 实现的方法: INSERT、SEACH、DELETE 先简单说明下这几个方法的实现原理: SEARCH: 查询方法的思路很简单,和二分查找相似,即从根节点开始查找,若待查找元素a小于根节点,则在该节点的左子树中继续查找,大于则去右子树中,等于便是找到了。 INSERT: 插入方法,也是一个查询的过程,若根节点为空,则直接设置成跟节点,否则依如下方式与节点比较: 若小于节点值,将元素插入其左子树,若大于该节点值插入其右子树。若发现相等的则退出,算是排重。 DELETE: 删除操作相对比较复杂,若要删除某一个节点 Z ,可能遇见三种情况: 一. 节点 Z 不包含任何子树;此时可直接删除,不影响数据的结构。 二. 节点 Z 只有一个子子树,左子树或右子树;此时只需将 Z 的唯一的那个子树的根节点指向 Z 的父节点即可,此操作也不影响数据的。(但由于我是基于数组的,指针式通过数组的位置表示,所以某个节点指向变了

MySQL 索引机制

不问归期 提交于 2019-12-04 03:43:49
MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 MySQL InnoDB 锁 MySQL InnoDB MVCC MySQL InnoDB 实现高并发原理 MySQL InnoDB 快照读在RR和RC下有何差异 索引是什么? 索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。 MySQL 的索引是硬盘级,索引数据是保存在硬盘上的,有部分数据可以放入缓存,后面的文章会描述到, InnerDB 有一个缓存池,缓存池的大小是可以通过配置文件配置。 我们通过下图来看看 MySQL 的索引是怎么工作的? 比如我们建了一张老师表,有 N 条数据,每条数据对应有一个磁盘地址,在没有引入索引机制的情况下,我们要查一条姓名等于王五的数据,我们需要一条一条比对老师表的所有数据,当老师表的数据量比较多时,全表比对检索的速度会非常慢。 这样我们就必须引入索引机制,比如我们对 id 建了一个索引,要查一条 id 等于101的数据,我们可以通过索引的数据结构快速检索出 id 等于101的磁盘地址,这样就可以通过磁盘地址快速定位到表中的数据。 为什么要用索引? 索引能极大的减少存储引擎需要扫描的数据量 索引可以把随机 IO 变成顺序 IO

数据结构中各种树

a 夏天 提交于 2019-12-03 23:09:33
阅读目录 1. 二叉树 2. 二叉查找树 3. 平衡二叉树 3.1 平衡查找树之AVL树 3.2 平衡二叉树之红黑树 4. B树 5. B+树 6. B*树 7. Trie树   数据结构中有很多树的结构,其中包括二叉树、二叉搜索树、2-3树、红黑树等等。本文中对数据结构中常见的几种树的概念和用途进行了汇总,不求严格精准,但求简单易懂。 回到顶部 1. 二叉树   二叉树是数据结构中一种重要的数据结构,也是树表家族最为基础的结构。 二叉树的定义: 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2 i-1 个结点;深度为k的二叉树至多有2 k-1 个结点;对任何一棵二叉树T,如果其终端结点数为n 0 ,度为2的结点数为n 2 ,则n 0 =n 2 +1。 二叉树的示例 : 满二叉树和完全二叉树:   满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。也可以这样理解,除叶子结点外的所有结点均有两个子结点。节点数达到最大值,所有叶子结点必须在同一层上。   满二叉树的性质:   1) 一颗树深度为h,最大层数为k,深度与最大层数相同,k=h;   2) 叶子数为2 h ;   3) 第k层的结点数是:2 k-1 ;   4) 总结点数是:2 k-1 ,且总节点数一定是奇数。   完全二叉树

【NOI2009】二叉查找树

早过忘川 提交于 2019-12-03 13:29:49
题面 https://www.luogu.org/problem/P1864 题解 首先离散化优先级。 首先按权值排序,得到$dfs$序,一棵子树对于$dfs$序上一段区间,区间$dp$的经典模型。 设$F[k][l][r]$为对于$[l..r]$的元素,它们形成一棵二叉查找树,并且根节点的优先级$>k$的最小代价。(这样就可以接上一个优先级为$k$的根了) 转移时,枚举根节点(中间点),我们只考虑修改根节点的优先级,即 来源: https://www.cnblogs.com/shxnb666/p/11797063.html