从二叉搜索树到红黑树

news2024/9/22 4:05:48

二叉搜索树(Binary Search Tree)

特性

任意一个节点的所有左子树都比它小,所有右子树都比它大;

复杂度

当我们查找某个节点的时候,先从根节点开始比较,如果比根节点大走右子树,如果比根节点小走左子树。可以看到查询的复杂度呢,是完全依赖于树的深度。 写入某个节点的时候同理; 所以二叉搜索树的读和写的复杂度都是 O(log n)。search O(log n)。

缺点

当我们插入连续自增和自减的数据时,它就会变成一条连续的左子树或者连续的右子树。从而树型结构变成了线性结构。线性结构的复杂度依赖的还是树的深度,查询和插入复杂度从原来树型结构O(log n)变成了O(n)。BST表现性能会退化,一般常见的语言中,使用的存储结构会发现正真使用原生的BST的会非常少,都是经过一些优化的数据结构。

平衡二叉树(AVL)

全称为“平衡二叉搜索树”,它是由苏联数学家Adelson-Velsky 和 Landis 提出来的,因此平衡二叉树又叫AVL树。

特性

任意节点的左子树和右子树的深度差 <= 1,条件是比较苛刻的,自平衡和优化也需要浪费一些时间;

复杂度

查询、读和写的复杂度都是 O(log n),是继承至 BST 算比较好的优化;

红黑树(Red Black Tree)

特性

有人说红黑树也是自平衡二叉树的一种,不过对于“平衡”的标准比自平衡二叉树来说要严格的多。

  1. 红黑代表某个节点要么是红节点,否则就是黑节点。
  2. root节点是个黑节点。
  3. 叶子节点是黑节点,也可以是 null 节点,所以 null 节点 也是黑节点 。
  4. 红节点的子节点必须是黑节点。

从以上4个特性可以看到,红节点生存非常恶劣。

  1. 新插入节点是红节点,但是可能会经过红黑的自平衡和优化变成黑节点。
  2. 任意节点到叶子结点路径上黑节点的个数相同。上界:路径上黑节点个数相同(n)。下界:关注红节点出现的苛刻条件,节点数差一倍(2n)。

红黑树一系列特性要实现的终极效果:左右子树的深度差一倍以内,相较于AVL来说条件会宽松很多。所以插入节点时的变化要少很多。写的性能会高很多。

面试题

Java8中HashMap实现,每一个桶是一个链表,当链表长度达到8以上了,那么这个链表就会变成红黑树,为什么要选择红黑树的这种存储结构,而不是 BST 或 AVL,题目也可以改成:TreeMap 底层是红黑树而非 BST 或 AVL。

  1. 当我们插入连续自增和自减的数据时,它就会变成一条连续的左子树或者连续的右子树。从而树型结构变成了线性结构,从而退化成链表。
  2. 红黑树相比于 AVL 树,它心目中的“平衡”条件是更加宽松的,使得在节点插入的时候,整颗树的变动会小很多。那么红黑树的复杂度也是 O(log n)?我们知道树的复杂度依赖于树的深度。

复杂度

n个节点 = Nr(n个红节点) + Nb(n个黑节点),当我遮住红节点时,它就是一颗 AVL 树。当显露出红节点时,任意节点到叶子结点,最复杂的结构就是红黑相间,节点数相差一倍。最差情况复杂度为 O(2 x log Nb) = O(2 x log n),Nb = n。常量 2 可以约掉,最后红黑树的复杂度时 O(log n)。

插入流程

父节点叔节点类型操作
无需操作
父节点和叔节点都变黑,祖父变红。祖父变成当前节点,递归这个规则。
左左右旋 + 变色
右右左旋 + 变色
左右先左旋,再右旋 + 变色
右左先右旋,再左旋 + 变色
  1. 父节点比较好理解,就是当前节点的父节点。

  2. 叔节点,就是父节点同一层的兄弟节点。

插入 0001 根节点

插入节点都是红节点,而红黑树的特性根节点是黑节点,红节点直接变成黑节点就可以了。

0001根节点

插入 0002 子节点

遵循 BST 的特性。父节点是根节点,叔节点是 null 节点,无需操作。

0002节点

插入 0003 节点

父节点 0002 是红节点,叔节点 null 节点是 0001 节点的左子节点, 等价于黑节点。父叔节点满足:红黑。

0003节点

类型是:右右,也就是祖父节点的右右节点。左旋:祖父节点变为父节点的左子节点,父亲与祖父辈分颠倒。

0003节点,左旋

变色:父节点是根节点,红色显然是不行的,遵循红黑树特性。根节点(任意节点)至叶子节点路径中黑节点个数相同,父节点和祖父节点发生颜色变化,红变黑,黑变红。

0003节点,变色

插入 0004 节点

父节点 0003 是红节点,叔节点 0001 是红节点,父叔节点满足:红红,类型:无。

0004节点

0004节点

父叔节点都变黑,祖父变红。

0004节点,变色

祖父节点变成当前插入的节点,递归父叔节点都是红节点的规则。遵循红黑树特性,祖父节点是根节点必须为黑节点,变色为黑节点。

0004节点,变色

插入 0010 节点

父叔:红黑,类型:右右,祖父节点的右右节点(没有叔节点)。

0010节点

先左旋。

0010节点,左旋

后变色,遵循红黑树特性,父节点(任意节点)至叶子节点路径中黑色节点个数相同,父节点和祖父节点发生颜色变化,红变黑,黑变红。

0010节点,变色

插入 0015 节点

类型:红红。

0015节点

变色:父叔节点变黑,祖父节点变红。祖父节点作为当前节点,继续递归类型:红红规则。

0015节点,变色

插入 0012 节点

遵循 BST 特性。 类型:右左,祖父节点的右左节点。

0012节点

先右旋:当前节点变为父节点,父节点变为右子节点,父子颠倒。

0012节点,右旋

再左旋 + 变色。

0012节点,左旋 + 变色

微信公众号:码云成化
关注可了解更多的教程及排版技巧。问题或建议,请公众号留言;
如果你觉得阿云对你有帮助,欢迎赞赏

希望可以帮到你!相互取暖,共同进步。

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

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

相关文章

码农该如何延长周末体验感

码农该如何延长周末体验感 码农该如何延长周末体验感 码农该如何延长周末体验感1.制定合理的工作计划&#xff1a;2.实践工作与生活的平衡&#xff1a;3.学习新技术或扩展知识领域4.参与开源项目或个人项目&#xff1a;5.与同事或朋友组织活动&#xff1a;6.自己写博客或者总结…

jeecgboot新建moudle,但是访问404,需要在open moudle setting 里面设置

jeecgboot新建moudle&#xff0c;但是访问404&#xff0c;需要在open moudle setting 里面设置 首先需要确定以下3个pom.xml 最最外层的pom.xml 最最外层的pom.xml <modules><module>jeecg-boot-base-core</module><module>jeecg-module-demo</m…

string类(使用+实现)(C++)

string string类“登场”string类 - 了解string类的常用接口常见构造容量操作访问及遍历操作迭代器分类作用 增删查改操作非成员函数 string类的实现string类重要的方法实现分析介绍构造函数拷贝构造函数赋值运算符重载总结 string类整体实现代码 写时拷贝&#xff08;了解&…

金三银四好像消失了,IT行业何时复苏!

疫情时候不敢离职&#xff0c;以为熬过来疫情了&#xff0c;行情会好一些&#xff0c;可是疫情结束了&#xff0c;反而行情更差了&#xff0c; 这是要哪样 我心中不由一万个 草泥&#x1f434; 路过 我心中不惊有了很多疑惑和感叹&#xff01; 自我10连问 我的心情 自去年下…

什么是合者生情?

有人说&#xff0c;自己的命运自己掌握&#xff0c;但必须以预知自己命运如何为前提。 若不知道自己的命运如何&#xff0c;却要掌握自己的命运&#xff0c;那只是一句空话&#xff0c;是自欺欺人。 而易学在我国历史上&#xff0c;直至现在&#xff0c;都起到了重大而深远的作…

Python入门【LEGB规则、面向对象简介、面向过程和面向对象思想、面向对象是什么? 对象的进化 、类的定义、对象完整内存结构 】(十三)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

ARM裸机-5

1、可编程器件的编程原理 1.1、电子器件的发展方向 模拟器件-->数字器件 ASIC-->可编程器件 1.2、可编程器件的特点 CPU在固定频率的时钟控制下节奏运行。 CPU可以通过总线读取外部存储设备中的二进制指令集&#xff0c;然后解码执行。 这些可以被CPU解码执行的二进制指…

SpringBoot临时属性设置

在Spring Boot中&#xff0c;可以通过设置临时属性来覆盖应用程序中定义的属性。这在某些情况下很有用&#xff0c;例如在命令行中指定配置参数或在测试环境中覆盖默认值。 你可以使用--&#xff08;双破折号&#xff09;语法来设置临时属性。以下是一些示例&#xff1a; 1. …

【点云处理教程】04 Python 中的点云过滤

一、说明 这是我的“点云处理”教程的第 4 篇文章。“点云处理”教程对初学者友好&#xff0c;我们将在其中简单地介绍从数据准备到数据分割和分类的点云处理管道。 在本教程中&#xff0c;我们将学习如何使用 Open3D 在 python 中过滤点云以进行下采样和异常值去除。使用 Open…

【GitOps系列】在 GitOps 工作流中实现蓝绿发布

文章目录 前言蓝绿发布概述手动实现蓝绿发布创建蓝色环境创建蓝色环境 Ingressroute部署绿色环境切换到绿色环境 蓝绿发布自动化安装 Argo Rollout创建 Rollout 对象创建 Service 和 Ingress访问蓝色环境发布自动化 访问 Argo Rollout Dashboard自动化原理结语 前言 在前几篇【…

Netty学习(四)

文章目录 四. 优化与源码1. 优化1.1 扩展序列化算法jdk序列化与反序列化Serializer & AlgorithmConfigapplication.properties MessageCodecSharableMessage&#xff08;抽象类&#xff09; 测试序列化测试反序列化测试 1.2 参数调优1&#xff09;CONNECT_TIMEOUT_MILLIS2&…

最强,自动化测试-自定义日志类及日志封装(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在自定义日志之前…

【机器学习】习题3.3Python编程实现对数几率回归

参考代码 结合自己的理解&#xff0c;添加注释。 代码 导入相关的库 import numpy as np import pandas as pd import matplotlib from matplotlib import pyplot as plt from sklearn import linear_model导入数据&#xff0c;进行数据处理和特征工程 # 1.数据处理&#x…

Windows系统如何修改文件日期属性

winr键&#xff0c;输入powershell,在弹出的命令窗口输入命令&#xff0c;案例如下&#xff1a; file_address E:\_OrderingProject\\PIC1101\ldv1s_0830_ec_result.tiftime_change "07/12/2022 20:42:23" 修改文件创建时间&#xff1a;creationtime $(Get-Item fi…

COMSOL三维Voronoi图泰森多边形3D模型轴压模拟及建模教程

多晶体模型采用三维Voronoi算法生成&#xff0c;试件尺寸为150150300mm棱柱模型&#xff0c;对晶格指定五种不同材料&#xff0c;实现晶格间的差异性。 对试件进行力学模拟&#xff0c;下侧为固定边界&#xff0c;限制z方向的位移&#xff0c;上表面通过给定位移的方式实现轴…

P2P网络NAT穿透原理(打洞方案)

1.关于NAT NAT技术&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是一种把内部网络&#xff08;简称为内网&#xff09;私有IP地址转换为外部网络&#xff08;简称为外网&#xff09;公共IP地址的技术&#xff0c;它使得一定范围内的多台主机只…

某拍房数据采集

某拍房数据采集 某拍房数据采集声明1.逆向目标2.寻找加密位置3.分析加密参数4.python代码书写 某拍房数据采集 声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的…

yo!这里是Linux常见命令总结

目录 前言 常见命令 ls指令 pwd指令 cd指令 touch指令 tree指令 mkdir指令&&rmdir指令 rm指令 man指令 cp指令 mv指令 echo指令 cat指令&&tac指令 more指令 less指令 head指令&&tail指令 find指令 grep指令 alias指令&&u…

NAT原理(网络地址转换)

NAT原理 网络地址转换&#xff08;Network Address Translation&#xff0c;简称NAT&#xff09; 是一种网络通信协议&#xff0c;它是在网络层上对IP地址进行转换的技术。 NAT技术可以将内部网络中的私有IP地址转换为公共IP地址&#xff0c;以便内部网络中的设备能够访问互…

2023-07-30力扣每日一题

链接&#xff1a; 142. 环形链表 II 题意&#xff1a; 求链表是否有环&#xff0c;并给出入环的点 解&#xff1a; 哈希关联标记或者快慢指针 快慢指针逻辑&#xff1a;设入环前长度a&#xff0c;快慢相遇时指针在b&#xff0c;环长度为c&#xff0c;fast2*slow&#xff…