算法精讲 | 树(番外):平衡世界的四大守护者:AVL vs 红黑树 vs B树 vs B+树

news2025/4/22 3:42:54

🌲 算法精讲 | 树(番外):平衡世界的四大守护者: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 TreeMapNTFS文件系统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+树?留言区等你故事!

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

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

相关文章

第十八:go 并发 goroutine

channel 可以让多个goroutine 之间实现通信 Add方法调用时机&#xff1a;必须在goroutine 启动之前调用Add方法来增加计数器的值。 如果在goroutine已经启动之后再调用Add&#xff0c;可能会导致Wait方法提前返回&#xff0c;因为计数器没有正确反映正在运行的goroutine的数量…

在vs中无法用QtDesigner打开ui文件的解决方法

解决方法 右键ui文件&#xff0c;选择打开方式&#xff0c;弹出如下界面。 点击添加&#xff0c;弹出如下界面 点击程序后边的三个点&#xff0c;去电脑查找designer.exe,我的位置为D:\Qt\Qt5.9.9\5.9.9\msvc2015_64\bin\designer.exe。 名称可以自己起一个名字&#xff0c…

图像识别技术与应用-YOLO

1 YOLO-V1 YOLO-V1它是经典的one-stage方法&#xff0c;You Only Look Once&#xff0c;名字就已经说明了一切&#xff01;把检测问题转化成回归问题&#xff0c;一个CNN就搞定了&#xff01;也可以对视频进行实时检测&#xff0c;应用领域非常广&#xff01; YOLO-V1诞生与2…

LLM推理和优化(1):基本概念介绍

一、LLM推理的核心过程&#xff1a;自回归生成 LLM&#xff08;如DeepSeek、ChatGPT、LLaMA系列等&#xff09;的推理本质是自回归生成&#xff1a;从初始输入&#xff08;如[CLS]或用户prompt&#xff09;开始&#xff0c;逐token预测下一个词&#xff0c;直到生成结束符&…

Kubernetes教程(七)了解集群、标签、Pod和Deployment

了解集群、标签、Pod和Deployment 一、K8s资源对象二、K8s集群1. Master2. Node 三、Namespace&#xff08;命名空间&#xff09;四、Label&#xff08;标签&#xff09;五、Pod1. 共享网络命名空间2. 共享数据 六、工作负载1. 设置副本数2. 应用升级 结语 Kubernetes的知识真的…

【最新】DeepSeek 实用集成工具有那些?

deepseek 系列github仓库地址 【主页】deepseek-aiDeepSeek-R1DeepSeek-V3DeepSeek-VL2【本文重点介绍】awesome-deepseek-integration 注意&#xff1a;以下内容来自awesome-deepseek-integration DeepSeek 实用集成&#xff08;awesome-deepseek-integration&#xff09; 将…

Flutter_学习记录_video_player、chewie 播放视频

1. video_player 视频播放 插件地址&#xff1a;https://pub.dev/packages/video_player 添加插件 导入头文件 import package:video_player/video_player.dart;Android配置&#xff08;iOS不用配置&#xff09; 修改这个文件&#xff1a;/android/app/src/main/AndroidMani…

【MySQL】增删改查进阶

目录 一、数据库约束 约束类型 NULL约束&#xff1a;非空约束 UNIQUE&#xff1a;唯一约束 DEFAULT&#xff1a;默认值约束 PRIMARY KEY&#xff1a;主键约束 FOREIGN KEY&#xff1a;外键约束 二、表的设计 三、新增 四、查询 聚合查询 聚合函数 GROUP BY子句 HA…

静态时序分析:SDC约束命令set_ideal_latency详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 当使用set_ideal_network命令将当前设计中的一组端口或引脚标记为理想网络源后&#xff0c;理想属性会沿着组合逻辑进行传播&#xff0c;理想网络中的线网和单元…

达梦数据库查看字符集编码

select SF_GET_UNICODE_FLAG(); 返回 0 代表数据库字符集编码为 GB18030 1 代表数据库字符集编码为 UTF-8 2 代表数据库字符集编码为韩文字符集 EUC-KR

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 定义颜色和游戏参数…

【Spring】@PostConstruct详解

在 Java 开发中&#xff0c;尤其是在基于 Spring 框架的项目里&#xff0c;我们常常会遇到需要在对象创建并完成依赖注入后&#xff0c;执行一些初始化操作的场景。PostConstruct注解正是为解决此类问题而诞生的&#xff0c;它为我们提供了一种便捷且优雅的方式来处理对象的初始…

OEM SQL Details and Session Details 5s 或者parallel 才会在sql monitor显示

从企业管理器 13.4 版本更新 10 (RU10) 开始&#xff0c;ASH Analytics 的 SQL 详细信息和会话详细信息深入屏幕已更新为使用 Oracle JET UI。 在 Ash Analytics 中&#xff0c;单击左下角区域中“热门 SQL”中的 SQL ID 即可深入了解 SQL 详细信息。 单击右下角“热门会话”区…

JSAR 基础 1.2.1 基础概念_空间小程序

JSAR 基础 1.2.1 基础概念_空间小程序 空间空间自由度可嵌入空间空间小程序 最新的技术进展表明&#xff0c;官网之前的文档准备废除了&#xff0c;基于xsml的开发将退出历史舞台&#xff0c;three.js和普通web结合的技术将成为主导。所以后续学习请移步three.js学习路径&#…

Spring Security的作用

一、概述 Spring Security是一个框架&#xff0c;提供认证&#xff08;authentication&#xff09;、授权&#xff08;authorization&#xff09;和保护&#xff0c;以抵御常见攻击。对 常见漏洞 的保护提供了全面的支持&#xff0c;它对保护命令式和响应式应用程序有一流的支…

数据结构与算法效率分析:时间复杂度与空间复杂度详解(C语言)

1. 算法效率 1.1 如何衡量一个算法的好坏&#xff1f; 在计算机程序设计中&#xff0c;衡量算法优劣的核心标准是效率。但效率不仅指运行速度&#xff0c;还需要综合以下因素&#xff1a; 时间因素&#xff1a;算法执行所需时间 空间因素&#xff1a;算法运行占用的内存空间…

数据类设计_图片类设计之4_规则类图形混合算法(前端架构)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇,讨论图片类型设计出来后在场景中如何表达,以及图片的混合算法.前面的内容属于铺垫和基础,这篇内容和实际联系起来了. 背景图和前景图 这里笔者想先…

从零使用docker并安装部署mysql8.3.0容器

在开始使用docker到完成mysql的安装部署&#xff0c;中间有很多的坑等着 安装docker并配置 sudo yum install docker-ce 启动docker并设置开机启动项 sudo systemctl start docker sudo systemctl enable docker查看docker是否启动 sudo systemctl status docker 或者直接…

cpu 多级缓存L1、L2、L3 与主存关系

现代 CPU 的多级缓存&#xff08;L1、L2、L3&#xff09;和主存&#xff08;DRAM&#xff09;构成了一个层次化的内存系统&#xff0c;旨在通过减少内存访问延迟和提高数据访问速度来优化计算性能。以下是对多级缓存和主存的详细解析&#xff1a; 1. 缓存层次结构 现代 CPU 通…

基于Python+SQLite实现校园信息化统计平台

一、项目基本情况 概述 本项目以清华大学为预期用户&#xff0c;作为校内信息化统计平台进行服务&#xff0c;建立网页端和移动端校内信息化统计平台&#xff0c;基于Project_1的需求实现。 本项目能够满足校内学生团体的几类统计需求&#xff0c;如活动报名、实验室招募、多…