红黑树RBT(Read Black Tree)小结

news/2025/1/16 4:52:04/

顺序搜索

  • 线性搜索:跟队列中一个个元素顺序比较
  • 时间复杂度是O(n)
  • 存在的问题:元素多时搜索很慢

二分搜索(Binary Search)

  • 队列中的元素有序,比如从小到大
  • 每次把队列一分为二,每次跟队列中的中间元素比较
  • 时间复杂度是O(log2/logn)
  • 存在的问题:为了保证有序,每次插入/删除元素需要移动大量元素

二叉查找树BST(Binary Search Tree)

  • 二叉树:任意一个结点左右最多只有两个子树
  • 二叉查找树:任意结点左子树的元素都小于又子树的节点
  • 时间复杂度:O(h)
  • 特点:
    • 查找效率和二分查找是一样的
    • 插入/删除不需要移动大量元素
  • 存在的问题:在极端情况下,树的高度会是元素的个数,时间复杂度变成O(n)

平衡二叉树AVL

Named after inventors Adelson-Velsky and Landis
在这里插入图片描述

  • AVL名字是根据三个发明者开头字母组成

  • 平衡:任何一个结点左右子树的高度差不能超过1

  • 在二叉查找树的基础上,通过平衡左右两边子树的高度,从而限制整个树的高度

  • 高度:log2/logn+1

  • 时间复杂度:O(log2/logn)

  • 平衡操作分类:LL、RR、LR、RL

  • 左旋:逆时针旋转
    请添加图片描述

  • 右旋:顺时针旋转
    请添加图片描述

  • LL型:左孩子的左子树上插入结点,进行右旋操作
    在这里插入图片描述

  • RR型:右孩子的右子树上插入结点,进行左旋操作
    在这里插入图片描述

  • LR型:左孩子的右子树上插入结点,先左旋,后右旋
    在这里插入图片描述

  • RL型:右孩子的左子树上插入结点,先右旋,后左旋
    在这里插入图片描述

  • 存在的问题:插入/删除会导致频繁的对元素平衡操作

红色树RBT(Read Black Tree)

  • 红黑树是一种自平衡二叉查找树,每个结点不是红色就是黑色

  • 相比AVL树,红黑树在插入和删除时需要旋转的次数更少,但是平衡性没有AVL好

    • 当插入和删除操作比较少,查找比较多时,由于平衡性更高,意味着树的高度会更低;使用AVL树更合适
    • 当插入和删除操作都比较多时,更适合红黑树
      在这里插入图片描述
  • 红黑树特点:

    • 每个结点,不是红色就是黑色
    • 红属性:红色结点的子结点一定是黑色的
      • 也就是不能连续两个是红色的
      • 黑色的可以连续都是黑色
    • 黑属性:根结点一定是黑色的
      • 叶子结点都是不存储数据的黑色结点
      • 从每个结点出发,到所有叶子结点的路径上的黑色结点个数都相同
  • 高度:2*log(n+1)

  • 时间复杂度:O(logn)

  • bh黑色高度:从一个结点到它的叶子结点所经过的黑色结点个数
    在这里插入图片描述

  • 插入元素:

    • 如果插入的是第一个根元素,标记为黑色,结束

    • 新插入的元素先标记成红色

    • 如果插入后父亲是黑色的,则不需要处理,结束

    • 如果插入后父亲是红色的,同时父亲的兄弟也是红色的:

      • 1.父亲和父亲的兄弟都变成黑色
      • 2.如果父亲的父亲作为根结点则不用变色,否则要变色
        在这里插入图片描述
    • 如果插入后父亲是红色的,但是父亲的兄弟不存在或者是黑色的

      • 1.先旋转平衡后变色
      • 2.具体是先将插入的元素变成黑色
      • 3.再将刚插入元素是父节点的父节点变成红色
        在这里插入图片描述

其他:

  • 一般情况不允许有重复元素,有重复元素插入时会失败
  • 如果需要保留重复元素,可以考虑在结点结构中增加一个字段记录元素重复次数
  • 结点和节点的区别:
    • 节点:一般是指某个处理中心,比如网络中的某个节点:计算机、路由器等等
    • 结点:某一个交叉点,没有特殊作用,一般算法中应该用这个结点

红黑树小结

  • 红黑树是一种自平衡二叉查找树,平衡性相对AVL树没有那么严格,但是在插入、删除、搜索综合性能方面更加优秀
  • 红色树主要有三个特点:
    • 根结点和叶子结点都是黑色的
    • 相邻的两个结点不能同时为红色
    • 每一个结点到叶子结点经过的每个路径上的黑色结点个数都相同

在这里插入图片描述

  • 最多高度:2*log(n+1);时间复杂度:logn
  • 插入元素:
    • 如果插入的是第一个根元素,则标记为黑色,结束

    • 插入的元素先标记为红色

    • 如果插入元素后,它的父结点是黑色的,则结束

    • 如果插入元素后,它的父结点和父结点的兄弟都是红色的

      • 先将父结点和父结点的兄弟都变成黑色
      • 父节点的父节点如果不是根结点则要变成红色
        在这里插入图片描述
    • 如果插入元素后,它的父节点是红色,但是父节点的兄弟为空或者为黑色

      • 1.先旋转平衡后变色
      • 2.具体是先将插入的元素变成黑色
      • 3.再将刚插入元素是父节点的父节点变成红色
        在这里插入图片描述

红黑树为什么高效?

因为红黑树是一种自平衡二叉查找树;

  • 在查找方面,使用的是二分查找法,每个结点左子树上的元素总是小于右子树上的元素,查找所需的次数也就是树的高度
  • 它通过平衡结点左右两个子树的高度,使得高度差总是小于等于1,使得整个树的高度得到控制,时间复杂度是O(logn)
  • 在插入删除方面,它在AVL树的基础上,通过红黑对结点着色,减少了旋转平衡的次数,使得插入删除效率也比较高

http://www.ppmy.cn/news/37874.html

相关文章

vue尚品汇商城项目-day01【2.vue-cli脚手架初始化项目的其他配置】

文章目录2.项目的其他配置2.1 项目运行时,让浏览器自动打开2.2 关闭eslint的校验功能、配置map不打包、配置默认打开浏览器显示无法访问的问题2.3 给src文件夹简写方法,配置别名,方便引入资源本人其他相关文章链接2.项目的其他配置 2.1 项目…

进入软件测试行业需要学习多久

软件测试作为行业刚需,吸引着大波小伙伴想要转行,同时也是因为入门简单,学习周期相对较短。系统的培训周期在3个半月左右,如果是自己自学,那么就要最少4-6个月左右的时间~ 当下,软件测试就是一个不错的选择…

作为大学生,你还不会搭建chatGPT微应用吗?

目录 引言ChatGPT是什么?背景:ChatGPT敢为人先,打破全球僵局示例演示:基于ChatGPT微应用实现的条件及步骤(1)整体框架(2)搭建前的准备工作(3)实际搭建步骤&a…

linux系统编程(1)--GCC和GDB

OS:ubuntu16.04 1.GCC编译器 gcc(GNU Compiler Collection,GNU 编译器套件),是由 GNU 开发的编程语言编译器。gcc原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、…

基于VHDL语言的汽车测速系统设计_kaic

摘 要 汽车是现代交通工具。车速是一项至关重要的指标。既影响着汽车运输的生产率,又关乎着汽车行驶有没有超速违章,还影响着汽车行驶时人们的人身安全。而伴随着我国国民的安全防范意识的逐步增强,人们也开始越来越关心因为汽车的超速而带来的极其严重…

Linux系统安装jdk1.8

一、jdk1.8的下载 官网地址:https://www.oracle.com/java/technologies/downloads/#java8 .rpm文件全称为Redhat Package Manager,是由Redhat公司开发的一种软件包管理机制。使用rpm命令来完成安装包的安装和卸载。 .tar文件只是单纯将文件压缩打包,相…

Keil5----跳转定义和查找功能

一、Keil5----跳转定义 跳转定义 鼠标左键点击要查找的变量 方法1: 点击鼠标右键,功能栏中有跳转定义的选项。 方法2: 按快捷键 F12 具体操作如下图所示: 跳转结果 二、Keil5----查找功能 1. 查找功能 鼠标左键点击要查找的变…

ffmpeg 将视频帧转换成jpg、png等图片

文章目录前言一、如何实现?1、查找编码器2、构造编码器上下文3、像素格式转换4、编码5、获取图片数据6、销毁资源二、完整代码三、使用示例1、视频帧保存jpg文件2、自定义数据构造AVFrame总结前言 有时播放实时流的时候有截图的需求,需要将解码出来的图…