算法精讲 | 树(番外):平衡世界的四大守护者:AVL vs 红黑树 vs B树 vs B+树
🌲 算法精讲 | 树(番外):平衡世界的四大守护者:AVL vs 红黑树 vs B树 vs B+树
📅 2025/03/12 || 🌟 推荐阅读时间 30分钟
🚀 开篇:数据结构界的四大天王
想象你是一名图书管理员,面对四种神奇的书架:
- AVL树书架:强迫症晚期,每放一本书都要拿水平仪测量 📏
- 红黑树书架:时尚弄潮儿,给书架涂红黑条纹 🎨
- B树书架:俄罗斯套娃大师,每个隔层能装 100 本书 📚
- B+树书架:目录狂魔,把索引刻在每一层 🗂️
今天我们一起破解它们的秘密!
🗺️ 知识导航图

一、AVL树:平衡强迫症患者
1.1 旋转手术四部曲

⚔️ 右旋代码演示
TreeNode rightRotate(TreeNode y) {TreeNode x = y.left; // 抓住左孩子TreeNode T2 = x.right; // 寄存右孙子x.right = y; // 乾坤大挪移y.left = T2; // 认领新孙子updateHeight(y); // 📏 更新身高updateHeight(x); // 📐 精确到毫米return x; // 新掌门登基
}
二、红黑树:染发艺术家
2.1 红黑法典五条

2.2 插入修复三部曲

🎨 染色代码片段
void fixInsertion(Node z) {while (z.parent.color == RED) {if (uncle.color == RED) { // 叔叔是红发parent.color = BLACK; // 🔴 → ⚫uncle.color = BLACK; // 🔴 → ⚫grandparent.color = RED; // ⚫ → 🔴z = grandparent; // 向上检查} else {// 旋转操作...}}root.color = BLACK; // 最终染黑
}
三、B树:图书馆长
3.1 B树结构解剖

📚 节点分裂演示

3.2 实战代码:B树插入
class BTreeNode:def __init__(self, t):self.keys = [] # 关键码库self.children = [] # 子节点库self.leaf = True # 是否叶子def insert(self, key):if len(self.keys) == 2*t - 1: # 🚨 节点满了!new_node = BTreeNode(self.t)# 分裂过程...# 插入逻辑...
四、B+树:超级目录
4.1 与B树的三大区别
- 📚 数据只存在叶子节点
- 🔗 叶子节点形成有序链表
- 🧲 非叶节点是密集索引
4.2 范围查询演示

🚀 查询代码示例
List<Integer> rangeQuery(BPlusTree tree, int start, int end) {Node curr = findLeaf(tree.root, start);List<Integer> result = new ArrayList<>();while (curr != null && curr.keys[0] <= end) {for (int key : curr.keys) {if (key >= start && key <= end) result.add(key);}curr = curr.next; // 链表跳跃}return result;
}
五、华山论剑:四大天王终极PK

| 特性 | AVL树 | 红黑树 | B树 | B+树 |
|---|---|---|---|---|
| 平衡标准 | 绝对平衡 | 黑高平衡 | 节点填充率 | 节点填充率 |
| 插入复杂度 | O(log n) | O(log n) | O(log_t n) | O(log_t n) |
| 查询速度 | ⚡极快 | 🚀快速 | 🚢稳定 | ✈️极速 |
| 适用场景 | 内存敏感 | 综合场景 | 文件系统 | 数据库索引 |
| 磁盘友好度 | ❌ | ❌ | ✅ | ✅✅ |
| 代码复杂度 | 😫高 | 😣中 | 😌较高 | 😅较高 |
| 经典应用 | 内存数据库 | Java TreeMap | NTFS文件系统 | MySQL索引 |
六、灵魂拷问室 💬
面试官:为什么Linux文件系统用B树而不用B+树?
答:① 文件系统需要快速定位单个文件 ② B树非叶节点存数据有利小文件 ③ B+树更适合范围扫描
面试官:红黑树为什么比AVL树应用更广?
答:① 插入删除旋转次数少 ② 颜色标记比存储高度节省内存 ③ 综合性能更均衡
面试官:B+树叶子链表如何维护?
答:分裂时更新指针→类似双向链表插入节点,合并时同步调整
面试官:为什么数据库用B+树不用B树?
答:① 查询更稳定(都要到叶子层) ② 范围查询吊打B树 ③ 非叶节点更"苗条"
面试官:HashMap为什么不用红黑树?
答:① 哈希冲突少时链表更快 ② 红黑树适合持久化结构 ③ 达到阈值才树化
面试官:B树的t值怎么选?
答:根据磁盘页大小!比如4KB页,假设key占16B,t≈4KB/(16B+8B)=170
七、实战训练场
7.1 AVL树平衡检测

7.2 红黑树插入案例
// 插入数字序列:3 → 7 → 2 → 5 → 4
public static void main(String[] args) {RedBlackTree tree = new RedBlackTree();tree.insert(3); // ⚫tree.insert(7); // 🔴 → 触发染色tree.insert(2); // 🔴 → 触发旋转tree.insert(5); // 🔴 → 叔叔节点处理tree.insert(4); // 🔴 → 复杂旋转
}
八、下期预告
《平衡森林的奇妙物语:从2-3树到跳表》 🔥 看点抢先:
- 🌳 2-3树的柔性平衡之道
- 🪜 跳表:用概率打破平衡的叛逆者
- 🧬 B*树:在B树基础上玩出新花样

🌟 互动时刻:四大天王中你最喜欢哪位?是强迫症的AVL,潮流的红黑树,还是磁盘大师B+树?留言区等你故事!
相关文章:
算法精讲 | 树(番外):平衡世界的四大守护者:AVL vs 红黑树 vs B树 vs B+树
🌲 算法精讲 | 树(番外):平衡世界的四大守护者:AVL vs 红黑树 vs B树 vs B树 📅 2025/03/12 || 🌟 推荐阅读时间 30分钟 🚀 开篇:数据结构界的四大天王 想象你是一名图书…...
第十八:go 并发 goroutine
channel 可以让多个goroutine 之间实现通信 Add方法调用时机:必须在goroutine 启动之前调用Add方法来增加计数器的值。 如果在goroutine已经启动之后再调用Add,可能会导致Wait方法提前返回,因为计数器没有正确反映正在运行的goroutine的数量…...
在vs中无法用QtDesigner打开ui文件的解决方法
解决方法 右键ui文件,选择打开方式,弹出如下界面。 点击添加,弹出如下界面 点击程序后边的三个点,去电脑查找designer.exe,我的位置为D:\Qt\Qt5.9.9\5.9.9\msvc2015_64\bin\designer.exe。 名称可以自己起一个名字,…...
【Maven教程与实战案例】
文章目录 前言一、Maven是什么?二、Maven的安装与配置1. 安装前置条件2. 下载与配置 Maven3. 验证安装 三、Maven的核心概念1. POM.xml 文件2. 构建生命周期与插件机制 四、实战项目示例1. 项目目录结构2. 编写代码App.javaAppTest.java 3. 构建项目4. 运行项目 前言…...
基于SSM的海外代购系统
一、 项目介绍 基于SSM的海外代购系统 角色:管理员、用户、代购员 管理员: 管理员登录海外代购系统可以添加、修改或者删除首页、代购员、用户、商品分类、海外代购、采购入库、系统管理、订单管理、用户资料 等。 用户:当用户打开系统的网…...
图像识别技术与应用-YOLO
1 YOLO-V1 YOLO-V1它是经典的one-stage方法,You Only Look Once,名字就已经说明了一切!把检测问题转化成回归问题,一个CNN就搞定了!也可以对视频进行实时检测,应用领域非常广! YOLO-V1诞生与2…...
严格把控K8S集群中的操作权限,为普通用户生成特定的kubeconfig文件
文章目录 前言一、背景二、证书和证书签名请求(了解)1.证书签名请求2.请求签名流程3.Kubernetes 签名者4.证书过期时间限制字段 二、脚本示例2.检查集群上下文及csr3.切换集群上下文,检查权限4.普通用户操作 总结 前言 使用并维护过K8S的ops/sre都知道,kubeconfig对于k8s的访问…...
LLM推理和优化(1):基本概念介绍
一、LLM推理的核心过程:自回归生成 LLM(如DeepSeek、ChatGPT、LLaMA系列等)的推理本质是自回归生成:从初始输入(如[CLS]或用户prompt)开始,逐token预测下一个词,直到生成结束符&…...
Kubernetes教程(七)了解集群、标签、Pod和Deployment
了解集群、标签、Pod和Deployment 一、K8s资源对象二、K8s集群1. Master2. Node 三、Namespace(命名空间)四、Label(标签)五、Pod1. 共享网络命名空间2. 共享数据 六、工作负载1. 设置副本数2. 应用升级 结语 Kubernetes的知识真的…...
zerotier搭建免费moon服务器
🌟 前言 ZeroTier是一种基于P2P的虚拟组网工具,通过搭建Moon服务器可大幅提升跨运营商/跨国节点的连接质量。本文使用云服务演示部署流程。 📋 准备工作 注册三丰云账号 创建CentOS 8.5实例 (这里选择centos8以上&a…...
【网络安全 | 漏洞挖掘】四链路账户接管
未经许可,不得转载。 文章目录 正文正文 这一过程始于身份验证流程中的 IDOR 漏洞。登录时,后台会发送多个请求。在 Burp Suite 分析这些请求时,我注意到一个值得关注的请求: 请求: POST /validateUser {"email": "victim@example.com" }响应: {…...
【最新】DeepSeek 实用集成工具有那些?
deepseek 系列github仓库地址 【主页】deepseek-aiDeepSeek-R1DeepSeek-V3DeepSeek-VL2【本文重点介绍】awesome-deepseek-integration 注意:以下内容来自awesome-deepseek-integration DeepSeek 实用集成(awesome-deepseek-integration) 将…...
linux 的免密切换用户PAM配置
/etc/pam.d/su是Linux系统中与用户切换(su命令)相关的PAM(Pluggable Authentication Modules,可插拔认证模块)配置文件。以下是对它的详细介绍: 简介 作用 PAM是一种用于管理系统认证的机制,…...
Flutter_学习记录_video_player、chewie 播放视频
1. video_player 视频播放 插件地址:https://pub.dev/packages/video_player 添加插件 导入头文件 import package:video_player/video_player.dart;Android配置(iOS不用配置) 修改这个文件:/android/app/src/main/AndroidMani…...
【MySQL】增删改查进阶
目录 一、数据库约束 约束类型 NULL约束:非空约束 UNIQUE:唯一约束 DEFAULT:默认值约束 PRIMARY KEY:主键约束 FOREIGN KEY:外键约束 二、表的设计 三、新增 四、查询 聚合查询 聚合函数 GROUP BY子句 HA…...
为什么会出现redis数据库?redis是什么?
什么是 Redis? 为什么要用 Redis? 下面我将从 Redis 出现的背景、Redis 的解决方案个来回答。 1、Redis 出现的背景 互联网的应用越来越多,例如社交网络、电商、实时服务发展的十分迅速,这就导致了传统技术栈(如关系型数据库)…...
静态时序分析:SDC约束命令set_ideal_latency详解
相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 当使用set_ideal_network命令将当前设计中的一组端口或引脚标记为理想网络源后,理想属性会沿着组合逻辑进行传播,理想网络中的线网和单元…...
达梦数据库查看字符集编码
select SF_GET_UNICODE_FLAG(); 返回 0 代表数据库字符集编码为 GB18030 1 代表数据库字符集编码为 UTF-8 2 代表数据库字符集编码为韩文字符集 EUC-KR...
LPDDR5x电源使用Si电容对PI和PSIJ影响分析
SoC可能包含许多高速接口,其中LPDDR5X目前因为高带宽、低功耗、大容量等性能优势开始逐渐在AI计算、5G通信、视频处理等领域开始使用。LPDDR5X目前的速率高达8.533 GT/s,以及多个为这些接口供电的IO电压轨,而这些IO轨的PDN需要提供低阻抗&…...
【玩转23种Java设计模式】结构型模式篇:组合模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…...
Pac-Man(吃豆人) 游戏
目录 前言 1. Pygame游戏开发基础 1.1 Pygame简介 1.2 游戏开发基本概念 1.3 Pygame核心模块介绍 2. 游戏设计与规划 2.1 游戏规则设计 2.2 游戏对象规划 2.3 技术方案选择 3. 创建游戏窗口与初始化 3.1 初始化Pygame环境 3.2 设置游戏窗口 3.3 定义颜色和游戏参数…...
内网安全防护新思路 —— HFish + ELK 与 T-Pot 全面蜜罐系统比较分析
在当前网络安全环境日益复杂的背景下,企业和组织面临着来自外部与内部的多种威胁。为了更好地了解攻击者行为、捕获恶意活动并及时响应,部署蜜罐(Honeypot)系统已成为提升内网安全防护的重要手段。本文将重点介绍两种内网蜜罐防护…...
贪心算法(5)(java)k次取反后最大化的数组和
题目:给定一个整数数组 nums 和一个整数 k,你可以进行最多 k 次取反操作。每次操作可以选择数组中的一个元素并将其取反(即 x 变为 -x)。最终返回经过 k 次取反操作后,数组可能的最大总和。 解法:分情况讨…...
【Spring】@PostConstruct详解
在 Java 开发中,尤其是在基于 Spring 框架的项目里,我们常常会遇到需要在对象创建并完成依赖注入后,执行一些初始化操作的场景。PostConstruct注解正是为解决此类问题而诞生的,它为我们提供了一种便捷且优雅的方式来处理对象的初始…...
OEM SQL Details and Session Details 5s 或者parallel 才会在sql monitor显示
从企业管理器 13.4 版本更新 10 (RU10) 开始,ASH Analytics 的 SQL 详细信息和会话详细信息深入屏幕已更新为使用 Oracle JET UI。 在 Ash Analytics 中,单击左下角区域中“热门 SQL”中的 SQL ID 即可深入了解 SQL 详细信息。 单击右下角“热门会话”区…...
JSAR 基础 1.2.1 基础概念_空间小程序
JSAR 基础 1.2.1 基础概念_空间小程序 空间空间自由度可嵌入空间空间小程序 最新的技术进展表明,官网之前的文档准备废除了,基于xsml的开发将退出历史舞台,three.js和普通web结合的技术将成为主导。所以后续学习请移步three.js学习路径&#…...
Spring Security的作用
一、概述 Spring Security是一个框架,提供认证(authentication)、授权(authorization)和保护,以抵御常见攻击。对 常见漏洞 的保护提供了全面的支持,它对保护命令式和响应式应用程序有一流的支…...
数据结构与算法效率分析:时间复杂度与空间复杂度详解(C语言)
1. 算法效率 1.1 如何衡量一个算法的好坏? 在计算机程序设计中,衡量算法优劣的核心标准是效率。但效率不仅指运行速度,还需要综合以下因素: 时间因素:算法执行所需时间 空间因素:算法运行占用的内存空间…...
数据类设计_图片类设计之4_规则类图形混合算法(前端架构)
前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇,讨论图片类型设计出来后在场景中如何表达,以及图片的混合算法.前面的内容属于铺垫和基础,这篇内容和实际联系起来了. 背景图和前景图 这里笔者想先…...
从零使用docker并安装部署mysql8.3.0容器
在开始使用docker到完成mysql的安装部署,中间有很多的坑等着 安装docker并配置 sudo yum install docker-ce 启动docker并设置开机启动项 sudo systemctl start docker sudo systemctl enable docker查看docker是否启动 sudo systemctl status docker 或者直接…...
