当前位置: 首页 > news >正文

算法基础 -- 红黑树原理与插入伪代码

红黑树原理与插入伪代码

红黑树的原理

红黑树是一种自平衡的二叉搜索树,通过对节点的颜色(红色或黑色)以及结构的约束条件来保持树的平衡。红黑树的原理可以通过以下五个特性描述:

  1. 节点是红色或黑色
  2. 根节点必须是黑色
  3. 所有叶节点(即 NULL 节点)都是黑色的
  4. 红色节点的子节点必须是黑色,即红色节点不能有红色的父节点或子节点(无双红特性)。
  5. 从任一节点到其所有后代叶节点的所有路径上,必须包含相同数目的黑色节点

这些特性使红黑树能够在最坏情况下保证查找、插入和删除操作的时间复杂度为 O(log n),从而保持较好的性能。

红黑树的插入操作

红黑树的插入操作相对复杂,因为在每次插入新节点时,可能会破坏树的平衡。因此,需要进行颜色修正和旋转操作来重新平衡树。插入过程可以分为两个阶段:

  1. 插入节点:将新节点插入到树中,类似于普通的二叉搜索树插入。
  2. 修复树:修复因插入而可能破坏的红黑树特性。

插入节点的伪代码

function RB_INSERT(tree, value):new_node = Node(value)new_node.color = RED    # 新插入的节点初始为红色new_node.left = NULL    # 左子节点为空new_node.right = NULL   # 右子节点为空# 1. 查找插入位置current = tree.rootparent = NULLwhile current is not NULL:parent = currentif new_node.value < current.value:current = current.leftelse:current = current.right# 2. 插入节点并设置父节点new_node.parent = parentif parent is NULL:tree.root = new_node           # 树为空,新节点为根else if new_node.value < parent.value:parent.left = new_node         # 新节点为左子节点else:parent.right = new_node        # 新节点为右子节点# 3. 修复红黑树的平衡性RB_INSERT_FIXUP(tree, new_node)

修复树的伪代码

插入后,红黑树的性质可能被破坏,特别是双红问题(即父节点和子节点都是红色)。需要通过旋转和重新着色来修复树的平衡。

function RB_INSERT_FIXUP(tree, node):while node.parent is not NULL and node.parent.color == RED:if node.parent == node.parent.parent.left:  # 父节点是祖父的左子节点uncle = node.parent.parent.right        # 叔叔节点if uncle is not NULL and uncle.color == RED:  # 情况 1:叔叔节点是红色node.parent.color = BLACK           # 将父节点设为黑色uncle.color = BLACK                 # 将叔叔节点设为黑色node.parent.parent.color = RED      # 将祖父节点设为红色node = node.parent.parent           # 将祖父节点作为新的当前节点继续检查else:if node == node.parent.right:       # 情况 2:叔叔是黑色,且当前节点是右子节点node = node.parentLEFT_ROTATE(tree, node)         # 左旋父节点node.parent.color = BLACK           # 情况 3:叔叔是黑色,且当前节点是左子节点node.parent.parent.color = REDRIGHT_ROTATE(tree, node.parent.parent)  # 右旋祖父节点else:                                       # 父节点是祖父的右子节点(对称情况)uncle = node.parent.parent.left         # 叔叔节点if uncle is not NULL and uncle.color == RED:  # 情况 1:叔叔节点是红色node.parent.color = BLACKuncle.color = BLACKnode.parent.parent.color = REDnode = node.parent.parentelse:if node == node.parent.left:        # 情况 2:叔叔是黑色,且当前节点是左子节点node = node.parentRIGHT_ROTATE(tree, node)        # 右旋父节点node.parent.color = BLACK           # 情况 3:叔叔是黑色,且当前节点是右子节点node.parent.parent.color = REDLEFT_ROTATE(tree, node.parent.parent)  # 左旋祖父节点# 保证根节点为黑色tree.root.color = BLACK

左旋和右旋的伪代码

红黑树的平衡性是通过旋转来实现的。左旋和右旋操作用于在插入或删除节点时调整树的结构。

左旋的伪代码
function LEFT_ROTATE(tree, node):right_child = node.right               # 当前节点的右子节点node.right = right_child.left          # 右子节点的左子树变为当前节点的右子树if right_child.left is not NULL:right_child.left.parent = noderight_child.parent = node.parent       # 右子节点的父节点更新为当前节点的父节点if node.parent is NULL:tree.root = right_child            # 当前节点是根节点,更新根节点else if node == node.parent.left:node.parent.left = right_childelse:node.parent.right = right_childright_child.left = node                # 当前节点变为右子节点的左子节点node.parent = right_child
右旋的伪代码
function RIGHT_ROTATE(tree, node):left_child = node.left                 # 当前节点的左子节点node.left = left_child.right           # 左子节点的右子树变为当前节点的左子树if left_child.right is not NULL:left_child.right.parent = nodeleft_child.parent = node.parent        # 左子节点的父节点更新为当前节点的父节点if node.parent is NULL:tree.root = left_child             # 当前节点是根节点,更新根节点else if node == node.parent.left:node.parent.left = left_childelse:node.parent.right = left_childleft_child.right = node                # 当前节点变为左子节点的右子节点node.parent = left_child

总结

红黑树的插入操作通过节点插入、颜色修正以及旋转操作来保持树的平衡,确保了最坏情况下的时间复杂度为 O(log n)。插入伪代码的核心在于将新节点插入树中,然后通过颜色修正和旋转操作来保持红黑树的平衡特性。这使得红黑树能够在多次插入和删除操作后,依旧保持良好的查找性能。

相关文章:

算法基础 -- 红黑树原理与插入伪代码

红黑树原理与插入伪代码 红黑树的原理 红黑树是一种自平衡的二叉搜索树&#xff0c;通过对节点的颜色&#xff08;红色或黑色&#xff09;以及结构的约束条件来保持树的平衡。红黑树的原理可以通过以下五个特性描述&#xff1a; 节点是红色或黑色。根节点必须是黑色。所有叶…...

力扣 LeetCode 27. 移除元素(Day1:数组)

解题思路&#xff1a; 注意&#xff1a;数组只能覆盖&#xff0c;不能删除 erase方法的复杂度为O( n )而不是O( 1 )&#xff0c;因为需要把删除后后面的数组向前移动 方法一&#xff1a;双层for循环暴力 方法二&#xff1a;快慢指针 fast表示新数组的元素 slow表示新数组元…...

微服务链路追踪skywalking安装

‌SkyWalking是一个开源的分布式追踪系统&#xff0c;主要用于监控和分析微服务架构下的应用性能。‌ 它提供了分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案&#xff0c;特别适用于微服务、云原生架构和基于容器的环境&#xff08;如Docker、K8s、Mesos&…...

mqtt学习笔记(一)

以解决问题方式逐步学习探索 mqtt使用场景mqtt可能缺点mqtt学习疑问探索1、mqtt主题发布过的历史消息&#xff0c;全新连接的client能消费到吗&#xff1f;2、mqtt的client掉线如何重连&#xff0c;重连后订阅的topic配置还在不&#xff1f;3、mqtt的client掉线重连后&#xff…...

Kafka Eagle 安装教程

目录 前言 一、安装前的准备 1. 系统要求 2. 安装 JDK 3. 安装 Kafka 和 Zookeeper 4. MySQL 环境准备 二、下载并安装 Kafka Eagle 三、配置 Kafka Eagle 1. 编辑配置文件 2. 配置 Kafka 和 Zookeeper 信息 四、启动 Kafka Eagle 五、访问 Kafka Eagle 六、测试功…...

Ajax 获取进度和中断请求

HTML加入一些内容方便看效果和做交互&#xff1a; <div><p>当前传输进度&#xff1a;<span id"progress">0%</span></p><button id"send">发送</button><button id"btn">中断</button> …...

实验5:网络设备发现、管理和维护

实验5&#xff1a;网络设备发现、管理和维护 实验目的及要求&#xff1a; 通过实验&#xff0c;掌握Cisco 路由器和交换机的IOS配置管理。自动从NTP服务器获取时间信息。能够利用TFTP服务器实现路由器和交换机配置文件的备份和恢复。同时验证CDP协议和LLDP协议的网络参数。完…...

kafka 生产经验——数据积压(消费者如何提高吞吐量)

bit --> byte --> kb -->mb -->gb --> tb --> pb --> eb -> zb -->yb...

对等同步身份认证(Simultaneous Authentication of Equals,简称SAE)介绍

对等同步身份认证&#xff08;Simultaneous Authentication of Equals&#xff0c;简称SAE&#xff09;介绍 对等同步身份认证&#xff08;Simultaneous Authentication of Equals&#xff0c;简称SAE&#xff09;是一种基于密码的身份验证方法&#xff0c;用于安全地交换密钥…...

Ajax 与 Vue 框架应用点——随笔谈

老式 在老式的技术中&#xff0c;一个网页通常由前端工程师直接使用 HTML、CSS、JavaScript 编写而成 这种方式的优点很明显&#xff1a;简单粗暴&#xff0c;方便工程师以简单的思维完成工作 当然&#xff0c;缺点也很明显&#xff0c;包括但不限于&#xff1a; 直接原生开发…...

The Internals of PostgreSQL 翻译版 持续更新...

为了方便自己快速学习&#xff0c;整理了翻译版本&#xff0c;目前翻译的还不完善&#xff0c;后续会边学习边完善。 文档用于自己快速参考&#xff0c;会持续修正&#xff0c;能力有限,无法确保正确!!! 《The Internals of PostgreSQL 》 不是 《 PostgreSQL14 Internals 》…...

redis 原理篇 31 redis内存回收 内存淘汰策略

哦哦&#xff0c; 内存满了咋搞 就算过期key 删除&#xff0c;还是不够用&#xff0c; 这种问题没办法&#xff0c;只能了解一下啥解决方案了&#xff0c; 内存是有限的&#xff0c;一直存&#xff0c;肯定会满&#xff0c;这时&#xff0c;咋处理&#xff1f; 首先&#xff…...

微信小程序——实现二维码扫描功能(含代码)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

【go从零单排】HTTP客户端和服务端

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;net/http 包提供了强大的 HTTP 客户端和服务器功能。 &…...

Android 配置默认输入法

1.背景 最近有个国内的项目&#xff0c;预制了输入法apk&#xff0c;但是无法调出软键盘。原因是没有配置默认输入法&#xff0c;本文主要记录下如何配置默认输入法。 2.代码设置 设置默认输入法需要配置Settings.Secure.ENABLED_INPUT_METHODS和Settings.Secure.DEFAULT_IN…...

交易术语汇总(Technical Trading Dictionary)

Arbitrage (套利) --- 一种利用交易所之间的差价获利的方法。 Accumulation (累积) --- 在一种资产中建立头寸的过程。 Ask/Bid (询价/竞价) --- 卖出订单是询价(Ask)&#xff0c;买入订单是出价(Bid)。 ATH&#xff08;历史最高价) --- All-time high 全时高。 Bearish MS…...

【Docker】Docker基础及docker-compose

一、Docker下载 更新yum包 yum update 安装需要的软件包&#xff08; yum-util 提供yum-config-manager功能&#xff0c;后两个是devicemapper驱动依赖&#xff09; yum install -y yum-utils device-mapper-persistent-data lvm2 设置stable镜像仓库&#xff08;使用阿里…...

从零开始的 Hugging Face 项目:我的首个在线 SQL 查询工具之旅20241111

从零开始的 Hugging Face 项目&#xff1a;我的首个在线 SQL 查询工具之旅 作为一名 AI 初学者&#xff0c;我最近完成了一个意义非凡的项目&#xff1a;在 Hugging Face Spaces 上构建了一个简单却实用的在线 SQL 查询工具。这个项目不仅让我了解了 Hugging Face 平台的核心功…...

让AI为你发声!Windows电脑快速部署ChatTTS文本转语音神器

文章目录 前言1. 下载运行ChatTTS模型2. 安装Cpolar工具3. 实现公网访问4. 配置ChatTTS固定公网地址 前言 嘿&#xff0c;朋友们&#xff01;今天我们来聊聊如何在Windows系统上快速搭建ChatTTS&#xff0c;一个超酷的开源文本转语音项目。更棒的是&#xff0c;我们还可以用Cp…...

【AI换脸整合包及教程】FaceFusion 3.0.0:AI换脸技术的革新之旅

在人工智能技术的飞速发展中&#xff0c;AI换脸技术成为了近年来备受瞩目的焦点之一。FaceFusion 3.0.0&#xff0c;作为这一领域的最新力作&#xff0c;不仅继承了前代产品的优点&#xff0c;还在功能和用户体验上进行了全面升级和优化&#xff0c;为用户带来了前所未有的换脸…...

百度网盘解析工具:3步实现高速下载完全指南

百度网盘解析工具&#xff1a;3步实现高速下载完全指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘下载速度慢而烦恼吗&#xff1f;这款开源解析工具让您告…...

腾讯优图视觉模型应用:Youtu-VL-4B-Instruct在内容审核中的实战

腾讯优图视觉模型应用&#xff1a;Youtu-VL-4B-Instruct在内容审核中的实战 每天&#xff0c;互联网上会产生数十亿张图片和视频。对于内容平台来说&#xff0c;如何确保这些内容安全合规&#xff0c;同时控制审核成本&#xff0c;一直是个头疼的问题。传统的人工审核效率低、…...

Qwen-Image-Edit-2509镜像部署实战:跟着图文教程,10分钟跑通AI修图

Qwen-Image-Edit-2509镜像部署实战&#xff1a;跟着图文教程&#xff0c;10分钟跑通AI修图 1. 快速了解Qwen-Image-Edit-2509 Qwen-Image-Edit-2509是阿里巴巴通义千问团队推出的最新AI图像编辑工具。这个模型最大的特点是能够理解自然语言指令&#xff0c;对图片进行智能修改…...

mrm-can-bus:轻量级嵌入式CAN设备服务协议库

1. 项目概述mrm-can-bus是一个面向嵌入式设备控制场景的轻量级 CAN 总线通信库&#xff0c;定位为“CAN Bus connectivity and local functions exposed via CAN Bus, common part”——即提供标准化的 CAN 连接能力&#xff0c;并将本地设备功能&#xff08;如 GPIO 控制、ADC…...

把 SAP Fiori 后端授权模型讲透:从 PFCG、Catalog 到 SU24 的一条完整链路

很多团队在上线 SAP Fiori 应用时,会把注意力集中在前端目录、磁贴和页面配置上,结果到了联调或上线阶段才发现:用户明明能看到应用入口,点击之后却报错;或者应用能打开,但列表为空;再或者少数用户能看到不该看的业务数据。问题往往不在 UI 本身,而在后端授权模型没有真…...

velocity-subtemplate-variable-fix

为什么你的 Velocity 子模板变量总是失效&#xff1f;一行代码解决了阅读前提&#xff1a;你正在用 Velocity 做模板引擎开发&#xff0c;主模板能正常渲染&#xff0c;但子模板里一用变量就报空指针或者路径找不到。先说我的血泪史 昨晚被一个问题折磨了两个小时&#xff1a; …...

欧拉Euler~21.10系统下OpenSSH 9.0升级与安全加固实战指南

1. 环境准备&#xff1a;从零搭建OpenSSH 9.0升级基础 在欧拉Euler~21.10系统上升级OpenSSH&#xff0c;就像给老房子换新门窗——既要保证新功能正常使用&#xff0c;又不能破坏原有结构。我最近刚在测试环境完成这套操作&#xff0c;整个过程踩过几个坑&#xff0c;这里把完整…...

保姆级教程:在Windows 11上完美运行STM32CubeMX 6.9.0(附旧版本资源整理)

在Windows 11上完美运行STM32CubeMX历史版本的终极指南 最近升级到Windows 11后&#xff0c;我发现手头几个老项目使用的STM32CubeMX 6.9.0版本完全无法正常运行。每次启动不是闪退就是卡在初始化界面&#xff0c;而项目又必须使用这个特定版本才能保证代码兼容性。经过一周的…...

Display Driver Uninstaller深度清理实战指南

Display Driver Uninstaller深度清理实战指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller 当你遭遇游戏帧…...

全格式文档智能处理:AnythingLLM的多模态知识管理解决方案

全格式文档智能处理&#xff1a;AnythingLLM的多模态知识管理解决方案 【免费下载链接】anything-llm 这是一个全栈应用程序&#xff0c;可以将任何文档、资源&#xff08;如网址链接、音频、视频&#xff09;或内容片段转换为上下文&#xff0c;以便任何大语言模型&#xff08…...