面试官:了解二叉树吗,平衡二叉树,红黑树?

前言

面试过程中,多多少少会问一点数据结构(二叉树)的问题,今天我们来复习一下二叉树的相关问题,文末总结。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[js] 说说你对js对象生命周期的理解

[js] 说说你对js对象生命周期的理解 一切皆对象 咱们经常听到JS中“一切皆对象”?有没有问想过这是什么意思?其它语言也有“一切皆对象”之说,如Python。但是Python中的对象不仅仅是像JS对象这样的存放值和值的容器。Python中的对象是一个类…

(理论)数据库建模三步骤:概念模型-逻辑模型-物理模型

概念模型就是在了解了用户的需求,用户的业务领域工作情况以后,经过分析和总结,提炼出来的用以描述用户业务需求的一些概念的东西。如销售业务中的“客户”和“定单”,还有就是“商品”,“业务员”。 用USE CASE来描述…

java.util.UnknownFormatConversionException: Conversion = ‘j‘ || Conversion = ‘D‘ || Conversion = ‘Y‘

执行内容: String a "select * from j_question j where j.status %s and j.title like %java%"; String format String.format(a, 1); System.out.println(format);拼接SQL时,最后需要 format 替换字符串中的 %s 占位符。 预期效果&…

[js] 在DOM上同时绑定两个点击事件(一个用捕获,一个用冒泡),事件总共会执行几次,先执行哪个事件?

[js] 在DOM上同时绑定两个点击事件(一个用捕获,一个用冒泡),事件总共会执行几次,先执行哪个事件? 两次 先捕获,后冒泡个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易…

Jenkins: QQ/Wechat机器人群消息通知Job构建结果

简介 Jenkins是持续化集成的一个核心部件,它上游从仓库(gitlab)等拉取代码,经编译构建,将应用发布至下游目标环境;构建结果通知的方式有很多,现成的插件有邮件和钉钉方式,但是就方便…

[js] json和对象有什么区别?

[js] json和对象有什么区别? JSON 是对象,但对象不一定是 JSON。对象是由属性和属性值组成,也就是 KEY->VALUE 对。 对象中的 value 可以是任意的数据类型,包括函数。而 JSON 中的 value 不能为函数。个人简介 我是歌谣&…

Java中的Set对象去重

前言部分 Set<T> 去重相信大家一定不陌生&#xff0c;尤其是在 Set<String>、Set<Integer> 等等&#xff0c;但是在使用 Set<实体> &#xff0c;在不重写 equals()、hashCode() 方法情况下&#xff0c;直接使用貌似并不能生效。 所以想要 Set<实体…

openfalcon架构及相关服务配置详解

一&#xff1a;openfalcon组件 1.falcon-agent 数据采集组件 agent内置了一个http接口&#xff0c;会自动采集预先定义的各种采集项&#xff0c;每隔60秒&#xff0c;push到transfer。 2.transfer agent与transfer建立长连接&#xff0c;将数据汇报给tarnsfer transfer默认监听…

DBeaver连接达梦|虚谷|人大金仓等国产数据库

前言 工作中有些项目可能会接触到「达梦、虚谷、人大金仓」等国产数据库&#xff0c;但通常这些数据库自带的连接工具使用并不方便&#xff0c;所以这篇文章记录一下 DBeaver 连接国产数据库的通用模版&#xff0c;下文以达梦为例&#xff08;其他国产数据库连接操作方式一样&…

[js] script所在的位置会影响首屏显示时间吗

[js] script所在的位置会影响首屏显示时间吗 会&#xff0c;如果script放在头部&#xff0c;js的执行会阻塞dom树的构建个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面…

luogu4462 异或序列

题目大意 给出n,m,k&#xff0c;有n个数的序列&#xff0c;m次询问一段区间&#xff0c;问异或和等于K的子区间的个数。 题解 本题一看就是莫队。但要解决该题需要以下性质&#xff1a; 定理&#xff1a; $$a\oplus bc\Leftrightarrow a\oplus cb\Leftrightarrow b\oplus ca$$ …

Map<String,Object>接收参数,Long类型降级为Integer,报类型转换异常

前言 今天看群里小伙伴问了一个非常有意思的问题&#xff1a; 使用 Map<String,Object> 对象接收前端传递的参数&#xff0c;在后端取参时&#xff0c;因为接口文档中明确该字段类型为 Long &#xff0c;所以对接收的参数进行了强转&#xff0c;即 (Long)参数 &#xf…

adb无法连接安卓手机

确保已安装好手机驱动&#xff08;在设备管理器中能找到安卓的设备&#xff09;查看设备的VID信息找到你的模拟器存放的目录&#xff0c;<例如&#xff1a;C:\Users\Administrator\.android 下找到或新建一个adb_usb.ini文件。文档内容写入VID即可 在cmd上输入adb kill-serv…

那些对你说学历不重要,技术重要的人,他们大部分都是有学历的。

随便唠叨几句 最近有挺多小伙伴在微信上私信我&#xff0c;咨询提升学历问题的&#xff0c;希望我能给点意见&#xff0c;当然&#xff0c;这里面大部分是涉及到专升本&#xff0c;因为自己是过来人&#xff0c;所以感触比较深&#xff0c;耐心的给予了回复&#xff0c;整理后…

前端学习(2856):简单秒杀系统学习之定时器循环显示

<html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>javascrip</title></head><body ><script>function show() {console.log(每过1秒展示);}function show2(str) {…

SpringBoot中的Tomcat是如何启动的

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency>添加如上 Web 的依赖&#xff0c;Spring Boot 就帮我们内置了 Servlet 容器&#xff0c;默认使用的是 Tomcat&a…

json传输二进制的方案【转】

本文转自&#xff1a;http://wiyi.org/binary-to-string.html json 是一种很简洁的协议&#xff0c;但可惜的是&#xff0c;它只能传递基本的数型(int,long,string等)&#xff0c;但不能传递byte类型。如果想要传输图片等二进制文件的话&#xff0c;是没办法直接传输。 本文提供…

IDEA社区版(Community)和付费版(UItimate)的区别

比对类型Ultimate(终极版,付费)Community(社区版,免费)语言支持JavaJavaGroovyGroovyKotlinKotlinScala&#xff08;通过插件&#xff09;Scala&#xff08;通过插件&#xff09;Python 和 Jython&#xff08;通过插件&#xff09;Python 和 Jython&#xff08;通过插件&#x…

从使用传统Web框架到切换到Spring Boot后的总结

1、前言 其实我接触 Spring Boot 的时间并不长&#xff0c;所以还算一个初学者&#xff0c;这篇文章也算是我对 Spring Boot 学习以及使用过程中的复盘&#xff0c;如果文章出现描述错误或表达不清晰的地方&#xff0c;欢迎大家在评论区留言互动。 没想到 Spring Boot 这两年…

前端学习(2859):简单秒杀系统学习之前端界面布局

<html><head><meta charset"utf-8"><link rel"stylesheet" type"text/css" href"miao.min.css" charset"utf-8"><title>秒杀系统</title></head><body><div class"…