算法学习二,红黑树查找算法

算法学习二,红黑树查找算法

在红黑树的实现中,处理删除操作是一个复杂的过程,特别是当涉及到删除黑色节点时。红黑树的删除操作需要保持树的平衡和性质(即每条路径上的黑色节点数量相同)。以下是对红黑树删除操作的详细解释,特别是针对删除黑色节点的情况。

删除操作概述

  1. 删除节点:首先找到并删除目标节点。
  2. 重新平衡:如果删除的节点是红色,则不需要调整树的结构。但如果删除的是黑色节点,则需要进行重新平衡,以保持红黑树的性质。

重新平衡步骤

当删除一个黑色节点时,可能会导致树失去平衡,因为删除黑色节点会减少一条路径上的黑色节点数量。红黑树的重新平衡操作包括以下几种情况:

  1. 兄弟节点是红色

    • 将父节点和兄弟节点颜色互换。
    • 对父节点进行左旋或右旋。
    • 更新旋转后的新兄弟节点为黑色。
  2. 兄弟节点是黑色,且两个子节点都是黑色

    • 将兄弟节点设为红色。
    • 如果父节点也是黑色,则继续向上调整。
    • 如果父节点是红色,则将父节点设为黑色并结束调整。
  3. 兄弟节点是黑色,且有一个红色的左(右)子节点

    • 将父节点和兄弟节点颜色互换。
    • 对兄弟节点进行右旋或左旋。
    • 将旋转后的新兄弟节点设为黑色,并对新兄弟节点的另一个子节点进行左旋或右旋。

示例代码

以下是一个简化的红黑树删除操作的示例代码:

public void Delete(T key) { RedBlackTreeNode<T> nodeToDelete = Search(key); if (nodeToDelete == null) return; RedBlackTreeNode<T> y = nodeToDelete; bool originalColor = y.Color; RedBlackTreeNode<T> x; if (nodeToDelete.LeftChild == null) { x = nodeToDelete.RightChild; Transplant(nodeToDelete, nodeToDelete.RightChild); } else if (nodeToDelete.RightChild == null) { x = nodeToDelete.LeftChild; Transplant(nodeToDelete, nodeToDelete.LeftChild); } else { y = Min(nodeToDelete.RightChild); originalColor = y.Color; x = y.RightChild; if (y.Parent == nodeToDelete) x.Parent = y; else { Transplant(y, y.RightChild); y.RightChild = nodeToDelete.RightChild; y.RightChild.Parent = y; } Transplant(nodeToDelete, y); y.LeftChild = nodeToDelete.LeftChild; y.LeftChild.Parent = y; y.Color = nodeToDelete.Color; } if (originalColor == Color.Black) FixDelete(x); } private void FixDelete(RedBlackTreeNode<T> x) { while (x != mRoot && x.Color == Color.Black) { if (x == x.Parent.LeftChild) { RedBlackTreeNode<T> w = x.Parent.RightChild; if (w.Color == Color.Red) { w.Color = Color.Black; x.Parent.Color = Color.Red; RotateLeft(x.Parent); w = x.Parent.RightChild; } if (w.LeftChild.Color == Color.Black && w.RightChild.Color == Color.Black) { w.Color = Color.Red; x = x.Parent; } else { if (w.RightChild.Color == Color.Black) { w.LeftChild.Color = Color.Black; w.Color = Color.Red; RotateRight(w); w = x.Parent.RightChild; } w.Color = x.Parent.Color; x.Parent.Color = Color.Black; w.RightChild.Color = Color.Black; RotateLeft(x.Parent); break; } } else { RedBlackTreeNode<T> w = x.Parent.LeftChild; if (w.Color == Color.Red) { w.Color = Color.Black; x.Parent.Color = Color.Red; RotateRight(x.Parent); w = x.Parent.LeftChild; } if (w.RightChild.Color == Color.Black && w.LeftChild.Color == Color.Black) { w.Color = Color.Red; x = x.Parent; } else { if (w.LeftChild.Color == Color.Black) { w.RightChild.Color = Color.Black; w.Color = Color.Red; RotateLeft(w); w = x.Parent.LeftChild; } w.Color = x.Parent.Color; x.Parent.Color = Color.Black; w.LeftChild.Color = Color.Black; RotateRight(x.Parent); break; } } } x.Color = Color.Black; } 

总结

红黑树的删除操作需要仔细处理以保持树的平衡和性质。通过重新平衡操作,可以确保删除黑色节点后树仍然满足红黑树的性质。理解这些操作对于实现高效的红黑树非常关键。

Read more

【金仓数据库】ksql 指南(五) —— 创建与管理索引和视图(KingbaseES 查询优化核心)

【金仓数据库】ksql 指南(五) —— 创建与管理索引和视图(KingbaseES 查询优化核心)

引言 掌握表的基本运作之后,若想优化查询效率并简化数据访问,就要去学习“索引”和“视图”的运用,索引类似于“书籍目录”,可以极大地加快查询速度;视图类似“数据窗口”,能够隐藏复杂的查询逻辑,还能控制数据的可见性。本文就“ksql命令行操作索引与视图”展开论述,把从“作用到创建,再到查看,维持直至删除”的全过程拆解成实际操作步骤,并结合例子和避坑提示,以使初学者能够领悟并付诸实行。 文章目录 * 引言 * 一、前置准备:确认操作基础(衔接前文,确保连贯) * 1.1 1. 连接数据库并切换目标模式 * 1.2 2. 插入测试数据(用于验证索引 / 视图效果) * 二、索引管理:给表 “加目录”,加速查询 * 2.1 1.

By Ne0inhk
从 Express 到企业级架构:NestJS 实战指南与深度解析

从 Express 到企业级架构:NestJS 实战指南与深度解析

在 Node.js 的后端开发生态中,Express 长期以来以其极简主义占据统治地位。然而,随着项目规模的扩大,缺乏约束的“自由”往往会导致代码结构混乱,也就是我们常说的“意大利面条式代码”。 为了解决这个问题,NestJS 应运而生。NestJS 是一个用于构建高效、可扩展且易于维护的企业级后端应用的框架。它基于 TypeScript 构建,深受 Angular 架构的影响,引入了模块化、依赖注入(DI)和装饰器等先进概念。 本文将结合一个包含待办事项(Todos)管理和 PostgreSQL 数据库连接的实战 Demo,带你深入理解 NestJS 的核心架构。 一、 为什么选择 NestJS? 在开始写代码之前,我们需要理解 NestJS 试图解决什么问题。 1. 架构标准化:Express 让你自己决定文件放哪,而

By Ne0inhk
Go语言零基础小白学习知识点【基础版详解】

Go语言零基础小白学习知识点【基础版详解】

✅ 纯白话拆解+代码示例+实战场景,零基础能直接照着敲 ✅ 技术适配:基于Go 1.23(LTS长期支持版,企业主流),聚焦高并发、云原生核心场景 ✅ 条理清晰:从“环境搭建→基础语法→核心特性→实战入门”层层拆解,每个知识点落地到代码 ✅ 核心目标:小白不仅“懂概念”,更能“写得出、跑得起”,掌握Go语言入门核心能力 一、前置准备:先搞定环境和核心认知 1. Go语言是什么? Go(又称Golang)是谷歌2009年推出的编程语言,2026年已是云原生、高并发后端的首选语言——简单说: * 快:运行速度接近C/C++,编译速度秒杀Java; * 简单:语法比Java/Python更简洁,零基础3天能写业务代码; * 强:天生支持高并发,写直播、聊天、

By Ne0inhk
告别重复数据烦恼!MySQL ON DUPLICATE KEY UPDATE 优雅解决存在更新/不存在插入难题

告别重复数据烦恼!MySQL ON DUPLICATE KEY UPDATE 优雅解决存在更新/不存在插入难题

目录 * 前言 * 一、基本概念 * 1、什么是 ON DUPLICATE KEY UPDATE? * 2、工作原理 * 3、基本语法 * 二、使用场景 * 1、计数器更新 * 2、配置项更新 * 3、购物车商品更新 * 三、高级用法 * 1、条件更新 * 2、多表关联 * 3、批量操作优化 * 四、其他处理冲突的方案 * 1、REPLACE INTO * 2、INSERT IGNORE 前言 在日常的数据库操作中,我们经常会遇到这样的场景:“如果数据存在,就更新它;如果不存在,就插入一条新的”。这种模式通常被称为 “Upsert”(Update + Insert)。在

By Ne0inhk