目录

一、二叉查找树

特点:

插入方法:

查询方法:

删除方法:

二叉树的基础遍历:

二、堆

特点:

插入方法:

删除最大元素:

堆排序:

三、平衡二叉树

特点:

四、2-3查找树和红黑树

2-3查找树特点:

2-3查找树插入方法:

红黑树特点:

【面试题】TreeMap、TreeSet、HashMap底层实现中为什么使用红黑树?为什么不用二叉查找树?为什么不使用平衡树?

五、B树(B-树)

M叉B树特点:

【面试题】文件系统为什么要用B树而不用二叉查找树或者哈希表?

六、B+树

特点:

【面试题】为什么B+树在数据库用的多(Mysql底层是B+树),不用B树或者哈希表?


二叉树整合了数组和链表的优缺点,使得插入、删除、查找的速度都很快,效率高。树有很多类型,二叉树就是度不超过 2 的树

一、二叉查找树

特点:

左结点的key都小于右结点的key

插入方法:

1)树为空:新结点作为根结点

2)树不为空:从根结点开始找

2.1 新结点小于当前结点key,则继续找当前结点的左结点;

2.2 新结点大于当前结点key,则继续找当前结点的右结点;

2.3 新结点等于当前结点key,则替换当前结点的val。

查询方法:

从根结点开始:

1)查询结点小于当前结点key,则继续找当前结点的左结点;

2)查询结点大于当前结点key,则继续找当前结点的右结点;

3)查询结点等于当前结点key,则返回当前结点的val。

删除方法:

1)找到要删除的结点;

2)将要删除结点的右子树的最小结点替换当前要删除的结点。

二叉树的基础遍历:

1)前序遍历:先访问根结点,再访问左子树,最后访问右子树;

2)中序遍历:先访问左子树,再访问根结点,最后访问右子树;

3)后序遍历:先访问左子树,再访问右子树,最后访问根结点;

前、中、后其实就是指的访问根结点的时间。【中序遍历】用的最多,该方法遍历【结果有序】

4)层序遍历:从根结点开始,从上往下按层遍历。

前序遍历结果:EBADCGFH

中序遍历结果:ABCDEFGH

后序遍历结果:ACDBFHGE

层序遍历结果:EBGADFHC

二、堆

堆是一个完全二叉树,除了树的最后一层结点不需要是满的,其他每一层从左往右都是满的,如果最后一层结点不是满的,那么要求左满右不满。

特点:

每个结点都大于等于它的两个子结点,且两个子结点顺序没有规定。

注意与二叉查找树的区别!!!堆其实就是一个【最大优先队列】

插入方法:

1)将元素从最后一层插入,保证依旧是完全二叉树即可;

2)将插入原始从最后一层,不断上浮,直到满足每个结点都大于等于它的两个子结点。

(二叉查找树的插入是从根结点往下沉)


由于堆的结构特性,查询和删除任意值的效率低,一般用于查询或删除最大/最小值,是最大优先队列最小优先队列的底层实现结构。


删除最大元素:

1)根结点即最大元素,删除根结点;

2)将最后一个元素(最下面一层的最右边的元素)作为新的根结点;

3)将新的根结点不断下沉,直到满足每个结点都大于等于它的两个子结点。

堆排序:

堆排序就是不断取出(删除)最大元素的过程,取最大值,重新排列,再取最大值,再重新排列......

三、平衡二叉树

平衡二叉树,又被称为AVL树,是为了解决二叉树退化成一棵链表而诞生的。

特点:

1)拥有二叉查找树的全部特性;

2)每个节点的左子树和右子树的高度差至多等于1,左右子树的高度差是通过左旋右旋实现的。

平衡二叉树过于追求【完全平衡】,高度差为1的要求太过严格,尤其是对于频繁删除、插入的场景效率低。

四、2-3查找树和红黑树

2-3查找树特点:

为了保证树的平衡性,同时又保留一些灵活性,引入3-结点,允许一个3-结点保存2个键。

2-结点:同普通的二叉查找树,一个结点有一个键,对应2条链,左链均小于当前键,右链均大于当前键;

3-结点:一个结点有两个键,对应3条链,左键大于右键,左链均小于左键,右链均大于右键,中链位于左右键之间。

2-3查找树插入方法:

1)自顶向下查找到合适位置;

2)如果插入位置为2-结点,则直接将2-结点变为3-结点;

3)如果插入位置为3-结点,则将3-结点变为临时的4-结点(3个键),将中间键上提到父结点,如果父结点为2-结点,则直接变成3-结点;如果父结点为3-结点,则继续上提,直到根结点,若上提到根结点,根结点变为4-结点,则继续上提,树高+1;

注意:

1)4-结点变为3-结点,树高不会增加,只有当根结点为4-结点,分解根结点时,树高+1;

2)与普通二叉查找树相比,普通二叉查找树为自顶向下生长,2-3树为自底向上生长。

红黑树特点:

红黑树是对2-3树的编码:红链接:将两个2-结点连起来作为3-结点;黑链接:普通链接。

1)红链接均为左链接;

2)没有任何一个结点同时和两个红链接相连(否则就是4-结点了);

3)该树是完美平衡的,最下面的任意空结点到根结点的黑链接数量是相等的。

红黑树经过插入、删除等操作后,可能会出现一个结点同时和两个红链接相连,或者红链接出现在右链接的情况,此时需要通过:左旋、右旋、颜色翻转等操作来保证树的平衡。此处不展开分析。

【面试题】TreeMap、TreeSet、HashMap底层实现中为什么使用红黑树?为什么不用二叉查找树?为什么不使用平衡树?

1)二叉查找树在添加元素的时候极端情况下会出现线性结构,此时效率降低;

2)平衡二叉树追求绝对严格的平衡关系,在频繁的插入、删除等操作的情景下,效率低;

3)红黑树是一个“适度平衡”的二叉搜索树,而非如平衡二叉树一般“严格”的平衡;

红黑树与平衡二叉树(AVL)对比:

  • AVL更平衡,结构上更加直观,时间效能针对读取而言更高;维护稍慢,空间开销较大。
  • 红黑树,读取略逊于AVL,维护强于AVL,空间开销与AVL类似,内容极多时略优于AVL,维护优于AVL。

红黑树中最长支路的长度必然“不大于”最短者的2倍,设Max者为H,Min者为h,则有:H<=2h。从搜索的角度考虑,其复杂度为O(n)的,最长支路与最短支路搜索时间复杂度为O(H)<=O(2h),H和h无穷大时,最长支路和最短支路的搜索时间复杂度相等,从这个角度讲红黑树也算是“平衡”的。

红黑树有着良好的稳定性和完整的功能,性能表现也很不错,综合实力强,因此TreeMap、TreeSet、HashMap底层实现中会选择使用红黑树。

五、B树(B-树)

M叉B树特点:

1)每个结点最多有M-1个key,并以升序排列;

2)每个结点最多能有M个子结点;

3)根结点至少有两个子结点。

【面试题】文件系统为什么要用B树而不用二叉查找树或者哈希表? 

如果是查找效率(即比较次数)的话,实际上二叉树可以说是最快的了,但是,我们的文件索引是存放在磁盘上的,所以我们不仅要考虑查找效率,还要考虑磁盘的寻址加载次数,而这也是我们为什么要用 B 树的原因。

在把磁盘里的数据加载到内存中的时候,是以页为单位来加载的,而我们也知道,节点与节点之间的数据是不连续的,所以不同的节点,很有可能分布在不同的磁盘页中。所以对于上面的二叉查找树,我们可能需要进行 4 次寻址加载,而对于 B 树,由于 B 树的每一个节点,可以存放多个元素,所以磁盘寻址加载的次数会比较少。

哈希表虽然能够再 O(1) 查找到目标数据,但如果要进行模糊查找的话,却只能遍历所有数据,并且如果出现了极端情况,哈希表冲突的元素太多,也会导致线性时间的查找效率的。

二叉搜索树、平衡二叉树、红黑树、B树、B+树面试题_樊庆威的博客-CSDN博客https://blog.csdn.net/qq_41765712/article/details/104228938?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~TopBlog-1.topblog&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~TopBlog-1.topblog&utm_relevant_index=2

六、B+树

特点:

1)同B树,一个结点可以有多个key;

2)非叶子结点只有索引作用,即只存key,不保存val;

2)所有叶结点保存val,并且构成一个有序链表,可以按照key排序依次遍历全部数据。


由于B+树非叶子结点不包含数据,因此在内存相同的情况下,能存储更多的key,且链表结构有利于区间查找。


【面试题】为什么B+树在数据库用的多(Mysql底层是B+树),不用B树或者哈希表?

数据库中select数据,不一定只选一条,B树的话需要做局部的中序遍历,可能跨层访问,而B+树由于所有数据都在叶子节点,并且链表链接,只要找到首尾,就能找出所有数据。且在数据量大的情况可能无法一次装入内存,B+树的设计可以允许数据分批。

  1. 相对于二叉树,层级更少,搜索效率高;
  2. 对于B树,无论是叶子节点还是非叶子节点,都会存储数据,而每一个节点都用一页保存,一页大小为16K,每页中都存储K-V,会导致存储的Key减少,同样保存大量数据时,只能增加树的高度,导致性能降低;
  3. 相对于Hash索引,B+树支持范围匹配及排序操作,Hash索引存在Hash碰撞,降低效率,且只允许精准查找。

树型结构总结:二叉查找树、堆、平衡树、2-3查找树、红黑树、B树、B+树相关推荐

  1. 遍历HashMap源码——红黑树原理、HashMap红黑树实现与反树型化(三)

    本章将是HashMap源码的最后一章,将介绍红黑树及其实现,HashMap的remove方法与反树型化.长文预警~~ 遍历HashMap源码--红黑树原理.HashMap红黑树实现与反树型化 什么是红 ...

  2. dtree和jquery构建树型结构

    对于小型的树型应用来说,dtree是一个不错的选择. 先看一眼dtree给的例子 构造静态树 首先引入css文件和js文件 <link rel="StyleSheet" hr ...

  3. 【唠叨两句】如何将一张树型结构的Excel表格中的数据导入到多张数据库表中...

    小弟昨天遇到一个相对比较棘手的问题,就像标题说的那样.如何将一张树型结构的Excel表格中的数据导入到多张数据库表中,在现实中实际是七张数据库表,这七张表之间有着有着相对比较复杂的主外键关系,对于我这 ...

  4. EF架构~单表一对多集合的插入(树型结构)

    单表一对多关系很常见,它是一种树形结构,如系统菜单表,部门表,分类表,这些都可以做成单表一对多关系,而这些表做成一对多关系后,如果通过EntityFramework进行插入操作时,会很方便,EF会自动 ...

  5. C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考

    为什么80%的码农都做不了架构师?>>>    应用软件是否好用就体现在一些细节操作上,开发人员是否考虑到了很多细节,例如一个树形结构的数据若不支持拖拽功能那用起来会很糟糕一些,用户 ...

  6. go之树型结构深度理解补充

    go之树型结构深度理解补充 在上一篇中借用了 Ilija Eftimov 文章来讲解了tree的定义和一些方法.这篇文章主要是讲解在树型结构中如何判断节点与节点之间的关系. A节点是否是B节点的直接上 ...

  7. Nestable 可移动拖拽的树型结构的使用(jQuery)

    利用jQuery可以制作出很好的树型结构.这里介绍一款最近才找到使用的Nestable 可以拖动.  网页中的效果 http://dbushell.github.com/Nestable/ 具体详细介 ...

  8. mysql 转成树_Mysql树型结构2种方式及相互转换

    Mysql实现树型结构,数据库上常见有2种方式:领接表.预排序遍历树(MPTT). 领接表方式-- 主要依赖于一个 parent 字段,用于指向上级节点,将相邻的上下级节点连接起来,id 为自动递增自 ...

  9. php删除树结构文件,树型结构列出目录中所有文件的php代码

    以树型结构列出指定目录里的所有文件,这样的话,目录下的所有文件便结构清晰的呈现在你的面前,有什么文件你一看便知,很方便的哦. 示例, php; auto-links:false;"> ...

  10. axure树形表格_Axure教程:可增删改的树型结构

    原标题:Axure教程:可增删改的树型结构 今天,教大家如何做一个树型结构,以及节点与节点之间相互交互的内容. 演示地址:http://b0bgsg.axshare.cn/#g=1&p=树 一 ...

最新文章

  1. NetBpm 组织架构(4)
  2. Eclipse安装插件的几种方式
  3. Turtlebot2 环境配置
  4. 计算机制说明书的实训报告,实训报告总结
  5. [HAOI2007]反素数ant
  6. jenkins 下载插件 一直失败_实用测试技能分享:jmeter+Jenkins性能测试自动化搭建...
  7. windows桌面待办事项_想拒绝拖延症?你还缺一款云同步提醒的的桌面便签软件!...
  8. linux中挂载磁盘步骤
  9. C# WPF仿360安全卫士11
  10. 2018怎样发英文外链才能提升谷歌排名
  11. 各宽带接入服务商简称整理
  12. CF235C Cyclical Quest(SAM)
  13. 基于FPGA的ADS1256讲解
  14. 嵌入式要学习哪些内容?
  15. 独立性检验的基本思想和初步应用
  16. 富士服务器A系列说明书,富士伺服驱动器FALDIC-用户手册.pdf
  17. python量化交易--因子选股策略
  18. Win7 DNS解析不准
  19. 张量网络算法基础(二、量子态、量子算符)
  20. 计算机安全的基本要求是什恶魔,公考面试真题:2018年3月17日银监会(计算机岗)面试真题1...

热门文章

  1. rancher部署安装好后,无法部署pod
  2. Linux Gnome 桌面美化
  3. python查看微信撤回消息怎么弄_微信撤回消息怎么查?Python3步啥都知道了!
  4. 解决树莓派 Error -110 whilst initializing SD card的一种方法
  5. 输入一个三位数,如果是水仙花数,输出YES,否则的话,输出NO;
  6. html缩放动画效果,CSS3鼠标hover背景图片缩放动画效果
  7. HotPower超级CRC计算器与第三方CRC计算器名词解释与对照及操作
  8. 2015年总结与感悟
  9. 基于JAVA EE的临床科室管理系统
  10. IPython使用Matplotlib画图时无法显示图片