红黑树与AVL树

news2025/7/21 1:11:26

文章目录

  • 前言
  • 一、AVL是什么?
  • 二、AVL的插入与删除
    • 插入
    • 删除
  • 三、红黑树是什么
  • 四、红黑树的插入与删除
    • 插入
    • 删除
  • 五、红黑树与AVL树的对比


前言

红黑树与AVL树是数据结构中避不开的话题,也是面试中常问的问题。今天就把他们总结在一起。

一、AVL是什么?

向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。为什么高度差的绝对值不超过1而不是0呢?因为如果高度差的绝对值不超过0,那么二叉树就变成满二叉树了,因此绝对值不能超过1。这就引入了平衡二叉树的概念:

AVL树也是一种自平衡的二叉搜索树,它通过节点的平衡因子(左子树高度减去右子树高度)来保持树的平衡性。AVL树的平衡性维护主要通过旋转操作来实现。

二、AVL的插入与删除

插入

1、插入新节点时,按照二叉搜索树的规则将其插入到合适的位置。

2、自底向上遍历从插入节点到根节点的路径,更新每个节点的平衡因子。
3、如果某个节点的平衡因子超过了1或-1,表示树失去了平衡,需要进行旋转操作来恢复平衡。
a、如果插入节点在失衡节点的左子树的左子树中,进行右旋操作。
b、如果插入节点在失衡节点的右子树的右子树中,进行左旋操作。
c、如果插入节点在失衡节点的左子树的右子树中,先对失衡节点的左子树进行左旋操作,再对失衡节点进行右旋操作。
d、如果插入节点在失衡节点的右子树的左子树中,先对失衡节点的右子树进行右旋操作,再对失衡节点进行左旋操作。
重复步骤2和步骤3,直到达到根节点。

删除

删除节点时,按照二叉搜索树的规则找到要删除的节点。
如果要删除的节点是叶子节点或只有一个子节点,直接删除并调整平衡即可。
如果要删除的节点有两个子节点,可以选择前驱或后继节点来替代删除节点,然后删除前驱或后继节点,并调整平衡。

1、自底向上遍历从删除节点到根节点的路径,更新每个节点的平衡因子。
2、如果某个节点的平衡因子超过了1或-1,表示树失去了平衡,需要进行旋转操作来恢复平衡。
a、旋转操作的类型和步骤与插入节点时的旋转操作相同。
重复上面,直到达到根节点。

三、红黑树是什么

在这里插入图片描述

   学过二叉查找树的同学都知道,普通的二叉查找树在极端情况下可退化成链表,此时的增删查效率都会比较低下。为了避免这种情况,就出现了一些自平衡的查找树,比如 AVL,红黑树等。这些自平衡的查找树通过定义一些性质,将任意节点的左右子树高度差控制在规定范围内,以达到平衡状态。

红黑树主要有这五条性质。
1.节点不是红色就是黑色
2.根节点是黑色
3.叶子节点(NIL)为黑色
4.每个红色节点的两个子节点都是黑色。((从每个叶子到根的所有路径上不能有两个连续的红色节点)
从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点

四、红黑树的插入与删除

插入

  1. 初始时,根节点为黑色。
  2. 插入新节点时,并将新节点插入为红色节点。
  3. 如果插入节点的父节点是黑色,无需进行调整。
  4. 如果插入节点的父节点是红色,那么需要进行调整以保持红黑树的性质。
    a. 如果插入节点的叔节点(父节点的兄弟节点)也是红色,那么将父节点和叔节点变为黑色,祖父节点变为红色,并以祖父节点为当前节点继续向上进行调整。
    b. 如果插入节点的叔节点是黑色或不存在,需要进行旋转和变色操作。
    i. 左旋或右旋操作:根据插入节点、父节点和祖父节点的相对位置进行旋转。旋转操作可以保持二叉搜索树的性质。
    ii. 变色操作:进行颜色的交换,使得父节点变为黑色,祖父节点变为红色。这样可以保持红黑树的黑高度不变。

删除

红黑树的删除操作相对比较复杂,因为删除一个节点可能会引发多种情况,需要仔细考虑旋转和颜色调整来维持红黑性质。以下是红黑树中执行删除操作的详细步骤,包括可能涉及的旋转和颜色调整。

删除操作的基本步骤:
找到要删除的节点: 首先,找到需要删除的目标节点。如果目标节点有两个子节点,可以选择它的后继节点(即右子树中最小的节点)来替代删除。
删除节点并用子节点替代: 删除目标节点,并用它的子节点(或者后继节点)来替代它的位置。

颜色调整和旋转: 在删除操作中,可能会导致红黑性质被破坏。以下是删除操作中可能需要考虑的情况:

删除节点为红色节点: 如果删除的节点是红色的,它不会破坏红黑性质。只需将它从树中移除即可。

删除节点为黑色节点: 删除的黑色节点可能会引发性质的破坏,需要进行颜色调整和旋转操作。

a. 删除节点有一个红色子节点: 如果删除的节点有一个红色子节点,用红色子节点替代删除节点,然后将子节点染成黑色,以保持黑高度性质。

b. 删除节点没有红色子节点: 如果删除的节点没有红色子节点,那么需要通过颜色调整和旋转来修复。

五、红黑树与AVL树的对比

红黑树(Red-Black Tree)和AVL树(Adelson-Velsky and Landis Tree)都是自平衡二叉搜索树,用于在动态数据集上进行高效的插入、删除和搜索操作。它们之间有一些相似之处,但也存在一些关键的区别。下面是红黑树和AVL树的比较:

平衡性:
红黑树:红黑树保证了一种弱平衡,即树的高度最多是2倍的对数级别。这使得红黑树在插入和删除操作时具有更高的灵活性,但可能导致一些操作稍微不如AVL树高效。
AVL树:AVL树是一种严格的平衡树,保证任何节点的左子树和右子树的高度差(平衡因子)不超过1。这确保了AVL树在平衡方面表现更好,但在插入和删除操作时可能需要更多的旋转来维持平衡。
插入和删除操作的性能:
红黑树:由于红黑树的平衡性要求相对较弱,插入和删除操作通常需要更少的旋转操作,因此在这些操作上性能可能比AVL树更好。
AVL树:AVL树的严格平衡性可能导致插入和删除操作需要更频繁的旋转操作,因此在这些操作上可能比红黑树略逊一筹。
搜索性能:

两者在搜索操作上都表现良好,因为它们都是二叉搜索树,保持了有序性。
存储空间:

红黑树:红黑树在维护平衡的同时,需要存储额外的颜色信息,因此通常比AVL树占用更少的存储空间。
AVL树:AVL树由于需要维护严格的平衡,可能需要更多的额外指针和信息,因此通常比红黑树占用更多的存储空间。
适用场景:
红黑树:适用于在插入和删除操作较频繁、搜索操作相对较少的场景,例如在数据库索引中。
AVL树:适用于搜索操作频繁、插入和删除操作相对较少的场景,以及对于对树的平衡性要求较高的场景。

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

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

相关文章

基于ChatGPT的智能客服助手

导读1.应用场景与系统框图2.搭建基于ChatGPT的智能客服助手 2.1 ChatGPT原理2.2 Prompt设计3.智能客服系统二期优化之用户问题分类 3.1 Bert简介3.2 用户问题分类网络训练数据3.3训练分类模型4.智能客服系统三期优化之商详和质检项相关知识筛选5.总结6.参考文献 导读 传统客服…

Web自动化测试:测试用例断言!

运行测试用例时,需要判断用例是否执行成功,此时需要有一个我们期望的结果来进行验证。这里unittest中,如果一个case执行的过程中报错,或者我们判断结果不符合期望,就会判定此条用例执行失败,判断的条件主要…

leetcode3. 无重复字符的最长子串 [滑动窗口]

题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释:…

蓝桥杯每日一题2023.10.17

迷宫 - 蓝桥云课 (lanqiao.cn) 题目描述 样例: 01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001100110100101 01111011010010001000001101001011100011000000010000 0100000000101010001101000010100000101010101100…

视频批量添加背景图片教程,详细步骤一看就会

你是否曾经需要为多个视频添加相同的背景图片?或者你需要为一些视频添加自定义的背景来增强视觉效果?如果你遇到了这样的问题,那么有一个软件可以帮助你解决,那就是固乔剪辑助手。下面是一个简单的步骤指南,教你如何使…

如何快速定位BUG?BUG定位技巧及测试人员定位的N板斧

很多测试人员可能会说,我的职责就是找到bug,至于找原因并修复,那是开发的事情,关我什么事? 好,我的回答是,如果您只想做一个测试人员最基本最本分的事情,那么可以这么想。但是&#…

基于边缘网关构建水污染监测治理方案

绿水青山就是金山银山,生态环境才是人类最宝贵的财富。但是在日常生活生产中,总是免不了各种污水的生产、排放。针对生产生活与环境保护的均衡,可以借助边缘网关打造环境污水监测治理体系,保障生活与环境的可持续性均衡发展。 水污…

数据结构-----红黑树(全)

目录 前言 一、什么是红黑树? 二、为什么需要红黑树?(与AVL树对比) 三、红黑树的特性 四、红黑树的储存结构 五、节点旋转操作 左旋(Left Rotation) 右旋(Right Rotation) 六、…

警惕!又2本Hindawi期刊被剔除,Scopus期刊目录更新!(附下载)

【SciencePub学术】 01Scopus目录更新概况 此次Scopus期刊目录更新后,有5本期刊不再被收录(Discontinued titles September 2023),同上次更新时相比,此次又新增93本期刊(Accepted titles)进入Scopus数据库。目前Scop…

Intelijj中报java版本错误

这次编译一个半年没动过的老项目,报了几次版本错误,通过多次尝试最终解决掉了该问题 错误一:Diamond types are not supported at language level 6 错误背景 该错误出现在intelijj中,打开项目后,下面的代码的后一个…

红海云签约COMMUNE,新兴餐饮行业加速人力资源数字化转型

COMMUNE是一家连锁餐酒吧品牌,将酒水自选区、超级吧台与经典就餐区三大功能板块有机融合,创建“复合商超零售经典西式餐饮”模式,是面向新中产阶层消费客群的全时段餐酒吧。 近日,连锁餐酒吧品牌COMMUNE母公司极物思维集团与红海…

C++ Builder 将运行时需要的库打进运行的程序包

一、打开【工程】–【选项】–【Linker】-- 设置【Use dynamic RTL】为 False 二、打开【工程】–【选项】–【组件包】-- 设置【和运行时组件包一起编译】为 False

Apipost使用介绍

相信无论是前端,还是后端的测试和开发人员,都遇到过这样的困难。不同工具之间数据一致性非常困难、低效。多个系统之间数据不一致,导致协作低效、频繁出问题,开发测试人员痛苦不堪。 API管理的难点在哪? 开发人员在 …

Qt Creator编译含opencv的程序时报错libopencv_calib3d.so:-1: error: error adding symbols

错误信息: /home/lyc/Exe/opencv-3.4.16/opencv_install/lib/libopencv_calib3d.so👎 error: error adding symbols: File in wrong format 进入libopencv_calib3d.so所在的目录,利用file查看文件格式。 由于libopencv_calib3d.so最终软链接…

Nginx的代理和负载均衡

一、nginx的代理方式 1.1 七层代理 七层代理:基于http协议,对请求的内容进行处理,然后转发到后端服务器 七层代理是客户端请求代理服务器,由代理服务器转发客户端的http请求,转发到内部的服务器进行处理(服务器可以是…

搭建NGINX服务 如何统计网页访问量

一、搭建Nginx服务 搭建之前需要查看一下我们的内核数制 我们进行简单的内核优化 命令:ulimit -n 65535 安装Nginx服务 第一步 关闭防火墙和安全机制 systemctl stop firewalld #关闭防火墙 systemct disable firewalld #开机自动关闭防火墙 setenfor…

Netty-SocketIo 完美替换 nodejs 的 socketio

背景 前段时间接到一个任务,用Java重构一个nodejs项目,其中用到了websocket的功能了,在nodejs项目中用的是socketio框架来实现websocket的功能,前端对应的也使用了socketio jar包。 一开始对socketio的用法并不是很清楚&#xff…

Unity Ugui 顶点颜色赋值

一、效果图 如下图:图片和文字的颜色都可以渐变,透明度也可以渐变。 原理分析: 不管是图片Image或是文本Text,它们都是网络Mesh来渲染网格是由很多三角形组成,那么我们根据坐标修改三角形的颜色即可实现。 工程源码…

进阶JAVA篇-如何理解作为参数使用的匿名内部类与 Arrays 类的常用API(九)

目录 目录 API 1.0 Arrays 类的说明 1.1 Arrays 类中的 toString() 静态方法 1.2 Arrays 类中的 copyOfRange(int[] original, int from, int to) 静态方法 1.3 Arrays 类中的 copyOf(int[] original, int newLength) 静态方法 1.4 Arrays 类中的 setAll(do…

论文研读|TextBack: Watermarking Text Classifiers using Backdooring

目录 论文信息文章简介研究动机研究方法水印生成水印嵌入版权验证 实验结果保真度 & 有效性消融实验 方法评估相关文献 论文信息 论文名称:TextBack: Watermarking Text Classifiers using Backdooring 作者:Nandish Chattopadhyay, et al. Nanyang…