面试官:了解二叉树吗,平衡二叉树,红黑树?
前言
面试过程中,多多少少会问一点数据结构(二叉树)的问题,今天我们来复习一下二叉树的相关问题,文末总结。
1. 二叉树的由来
在 jdk1.8 之前,HashMap 的数据结构由「数组+链表」组成,数组是 HashMap 的主体,链表是为了解决 Hash 冲突引入的,正常的数据存放是直接存在数组中,但如果发生 Hash 冲突就会以链表的形式进行存储,而在 jdk1.8之后,当链表的长度超过 8 之后,将会转换成红黑树经常存储…
相信这一段 HashMap 的描述,一定是大家所熟知的,其实细品之后,我们可以从这段描述中发掘这些信息。
数组
> 链表
> 树
。
正所谓有需求就会有发展,我们来看看为什么在有「数组+链表」的情况下,还出来个树结构。
数组优点:
- 简单易用,随机访问性强
- 无序数组插入速度很快,效率为O1
- 有序数组查找速度较快,效率为O(logN)
数组缺点:
- 插入和删除效率低
- 数组大小固定,无法动态扩容
链表优点:
- 大小不固定,无限扩容
- 插入和删除速度很快
链表缺点:
- 查询效率低,不支持随机查找,必须从第一个开始遍历
- 在链表非表头的位置进行插入、删除很慢,效率为O(N)
从数组到链表的优缺点,我们可以看出是各有千秋,不能很准确的说链表比数组就一定要高效,而正是因为这种关系的存在,所以二叉树出现了。
所以二叉树的由来:二叉树整合了数组和链表的优缺点,使得插入、删除、查找的速度都很快,效率比较高。
2. 二叉树是什么
二叉树是树形结构的一个重要类型,也是众多数据结构的基石。
树有很多类型,每个节点最多只能有两个子节点的叫二叉树。
所以,二叉树的特性就是每个节点的子结点不允许超过两个。
3. 二叉查找树
二叉查找树是一种特殊的二叉树,二叉查找树的特点就是,左子树节点比父节点小,右子树节点值比父节点大。
极端现象
二叉查找树有一种极端的存在,二叉树的大部分子节点都比父节点值小,然后导致所有的数据偏向左侧,进而退化成链表,如下图所示:
我们使用二叉树的目的是因为其效率高于链表查询,但这种退化为链表的现象很显然就突兀,怎么办呢。
所以为了解决二叉树退化成一棵链表就引入了平衡二叉树。
4. 平衡二叉树
平衡二叉树,又被称为AVL树,是为了解决二叉树退化成一棵链表而诞生的。
平衡二叉树特点:
- 拥有二叉查找树的全部特性。
- 每个节点的左子树和右子树的高度差至多等于1。
其中左右子树的高度差是通过左旋右旋实现的。
下面是一个平衡二叉树和非平衡二叉树的图:
到底是如何判断高度差的呢?我们可以来数节点最长连接数,比如左侧节点最长连接数为「3 > 4 > 5」3个节点,右侧为「9」一个节点,所以高度差为2。
再比如下面一个平衡二叉树:
左侧最长连接点为「3(9) > 7 >11」,即高度为2,右侧最长连接点为「14(16) > 15 > 18 > 11」,即高度为4,所以高度差为2。
为了维持二叉树的平衡,平衡二叉树是通过左旋、右旋来保证的,从大的方向旋转过程又被分为单旋转和双旋转,总之,旋转的作用就是避免出现节点偏向一边的情况,具体左旋、右旋操作在这就不详细阐述了。
但是平衡二叉树这种高度差为 1 的要求太严格了,尤其是对于频繁删除、插入的场景非常浪费时间…
5. 红黑树
对于那种频繁删除、插入的场景,平衡二叉树的调整过程显然是存在性能问题的,所以为了解决这个问题,进而又引入了红黑树。
红黑树的特点:
- 具有二叉树所有特点。
- 每个节点只能是红色或者是黑色。
- 根节点只能是黑色,且黑色根节点不存储数据。
- 任何相邻的节点都不能同时为红色。
- 红色的节点,它的子节点只能是黑色。
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
红黑树如下图所示:
概括为:红黑树所有的根节点都是黑色的的空节点,也就是根节点不存数据;任何相邻的节点都不能同时为红色,红色节点是被黑色节点隔开的,每个节点,从该节点到达其可达的叶子节点是所有路径,都包含相同数目的黑色节点。
正是因为这种特点,红黑树不同于平衡树的操作,红黑树不会因为插入、删除等操作追求绝对的平衡,它的旋转次数少,插入最多两次旋转,删除最多三次旋转,所以对于搜索、插入、删除操作较多的情况下,红黑树的效率是优于平衡二叉树的。
但是需要注意的是,如果应用场景中对插入、删除不频繁,只是对查找要求较高,那么平衡二叉树还是较优于红黑树。
总结
为什么有了数组和链表还要引入二叉树?
针对数组和链表的优缺点,无法说链表一定优于数组,或者是数组一定优于链表,因为某些长期的需要,所以就推出一个相对折中的二叉树。
为什么有了二叉树还要引入平衡二叉树?
有了二叉树还不算完,二叉树有一种极端的情况,就是所有的子结点偏向一端,二叉树退化成链表,这就相当于我选择了这种的二叉树,你现在罢工不干了,找了个链表来糊弄我…
所以为了解决二叉查找树退化为链表的情况,引入了平衡二叉树,即:
平衡二叉树是为了解决二叉树退化成一棵链表而诞生的。
既然有了平衡二叉树,这下总没有问题了吧?
为什么有了平衡二叉树还要引入红黑树?
但是是实际使用过程中,因为平衡二叉树追求绝对严格的平衡关系,显然这个规则在于频繁的插入、删除等操作的情景性能肯定会出现问题…
所以为了解决这个问题,进而又引入了红黑树。
平衡二叉树追求绝对严格的平衡,平衡条件必须满足左右子树高度差不超过1,红黑树是放弃追求完全平衡,它的旋转次数少,插入最多两次旋转,删除最多三次旋转,所以对于搜索、插入、删除操作较多的情况下,红黑树的效率是优于平衡二叉树的。
红黑树是终结吗?
时代总是进步的,大胆猜测不会是,就跟当初从数组、链表到二叉树一样。
至此,通过这篇希望大家对整个树结构的出现有一个基础的概念,目前面试中最为常问的就是红黑树了,当然这得益于 HashMap,但红黑树还有挺多其他的知识点可以考察,例如红黑树有哪些应用场景?红黑树与哈希表在不同应该场景的选择?红黑树有哪些性质?红黑树各种操作(插入删除查询)的时间复杂度是多少?等等等等…
希望这篇文章对你有所帮助,博客园持续更新欢迎关注。
博客园:https://www.cnblogs.com/niceyoo/p/13941947.html
面试官:了解二叉树吗,平衡二叉树,红黑树?相关推荐
- 在面试官面前优雅地种下红黑树
前言 希望面对面试官的各种红黑树的灵魂拷问时,也能像标题一般,优雅地娓娓道来. 目录 一.红黑树的基本性质 二.为什么要用红黑二叉树 1. 二叉搜索树(Binary Search Trees) 2.二 ...
- 二叉树 平衡二叉树 红黑树_迅捷树,二叉树
二叉树 平衡二叉树 红黑树 In this tutorial, we'll be discussing the Data Structure Trees and implement it using ...
- 面试之必掌握知识点:红黑树(一)
面试之必掌握知识点:红黑树(一) 现如今,国内大厂的面试是卷之又卷,像红黑树这种高级平衡树算法也经常会在面试中被问起,很多同学对红黑树一直保持一知半解的状态,为了能在面试中脱颖而出,今天我们一起来梳理 ...
- 数据结构-动态查找树表与平衡二叉树 红黑树简单介绍
参考资料 数据结构(严蔚敏) 大话数据结构 百度百科 https://blog.csdn.net/lpp0900320123/article/details/39524947 https://mp.w ...
- 高端的面试从来不会在HashMap的红黑树上纠缠太多
前言 在一场面试中最能打动面试官的其实是细节,候选人对细节的了解程度决定了留给面试官的印象到底是"基础扎实"还是"基础薄弱",如果候选人能够举一反三主动阐述自己 ...
- 【二叉树进阶】红黑树(Red Black Tree) - 平衡二叉搜索树
文章目录 一.红黑树的概念 二.红黑树的性质 2.1 红黑树和AVL树效率对比 三.红黑树的结构(KV模型) 四.红黑树的插入 4.1 插入节点 4.2 平衡化操作(难点) 4.2.1 情况一 4.2 ...
- 【数据结构 树:二叉树分类、红黑树讲解】
常用术语 节点:每一个小圈圈 父节点 : 下面有节点的节点 子节点 : 有父节点的节点 叶子节点 :没有子节点的节点 节点的权 :节点中的值 路径 :从根节点(root节点)到该节点的路线 层: ...
- 一位资深Java的阿里系公司实战面试经验,套路还是面试官的多
马老师说过,员工的离职原因很多,只有两点最真实: 1.钱,没给到位 2.心,受委屈了 以下是占小狼的一些实战面试经验分享,希望能帮助你们顺利拿到理想Offer! 项目经验 面试官在一开始会让你进行自我 ...
- 红黑树(RB-Tree)比AVL强在哪?
前言 以前本科同学在找工作的时候,就被面试官问到过关于红黑树的问题.因为当时我的知识面不广,所以也不知道红黑树是个什么东西,也没放在心上.在看过了STL源码后才知道原来有很多底层实现都用的红黑树.简单 ...
- 排序二叉树,平衡二叉树和红黑树的概念以及相关的操作讲解
1. 排序二叉树 排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索. 排序二叉树要么是一棵空二叉树,要么是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有节点的值均 ...
最新文章
- Socket通信---网络通信学习笔记(一)
- ts获取服务器数据_基于Nginx的媒体服务器技术-线上公开课
- Nginx系列(2):10分钟看懂Nginx到底能做什么?
- html网页生成工具
- vue获取微信登陆权限_vue微信授权登录
- 郑码输入法 字根记忆表 一般根变通处理
- 用js判断图片地址是否有效
- avatar Logo
- nisp一级练习题及答案
- wisp中远端服务器未响应,ESP8266当中继
- 大数据的反思:不可不知的几个小故事
- 车载综合信息平台方案
- 事件营销让面包圈有关注 但产品好才是真的好
- 【渝粤题库】广东开放大学 大学英语1 形成性考核
- 启明星辰信息安全面试
- Java Web打印控件(纯java手写版)
- matlab圆周卷积计算方法,线性卷积与圆周卷积的计算.doc
- GPU+VORONOI+KOKKOS+OPENMP反应力场加速
- 全球大数据产业发展现状与应用趋势
- ubuntu中软件安装方法
热门文章
- PS教程第十课:像素计算
- [html] Form表单是怎么上传文件的?你了解它的原理吗?
- 工作186:实际案例解决vue+el-element二级联动,选项选择后不显示的问题
- 前端学习(2330):angular之二级路由
- 前端学习(2161):vuecli项目得目录结构解析
- 玩转oracle 11g(41):rman备份-00554或者04005
- 玩转oracle 11g(36):rman备份-控制文件丢失恢复
- stm32+lwip(四):网页服务器测试
- php 最后几个字符,php怎么去掉最后三个字符
- 前端开发怎么用php,做web前端开发怎么样?