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

藏在底层的“树之家族”:从二叉树到B+树,你天天用却未必懂

写在前面“二叉树、二叉查找树、平衡二叉树、红黑树、B树、B树……这些数据结构我好像只在课本上见过。平时写业务代码一个ArrayList、HashMap走天下谁没事自己写树啊”这是很多后端开发者的真实想法。包括我自己学习和开发中几乎没有“手动”操作过任何一棵树。直到有一天我被问到“HashMap在哈希冲突严重时为什么转成红黑树”“MySQL索引为什么用B树而不是平衡二叉树”——我才发现虽然我不直接写树但每一行代码的底层都有一棵树在默默工作。今天我们就从“开发者视角”出发把这一家子的“树”彻底捋清楚它们是谁长什么样有什么区别以及你在日常开发中到底和它们打过多少次照面。一、开篇一张图树家族的“族谱”颜色说明红色标注的是你每天都在“间接使用”的树HashMap中的红黑树绿色标注的是数据库索引的核心B树。二、二叉树最朴素的“家族树”定义每个节点最多有两个子节点分别称为左孩子和右孩子。特性第 i 层最多有 2^(i-1) 个节点深度为 k 的二叉树最多有 2^k - 1 个节点开发中真的用到吗几乎不会直接使用原始二叉树因为它的形态完全取决于插入顺序——最坏情况下会退化成链表每个节点只有一个孩子查找复杂度从 O(log n) 变成 O(n)。你见过它当你用TreeSet或TreeMap时底层其实是红黑树一种特殊的二叉查找树。但原始的、不加约束的二叉树确实只活在教科书里。三、二叉查找树BST让查找有了“方向感”定义在二叉树的基础上增加约束——左子树所有节点值 根节点值 右子树所有节点值。优点查找、插入、删除的平均时间复杂度为 O(log n)。缺点依然可能退化成链表。例如按递增顺序插入1, 2, 3, 4, 5BST 就变成了一个只有右孩子的“斜树”。应用场景作为更高级平衡树的底层基础本身很少直接使用。图中是一棵合法的 BST左子节点 3 8右子节点 10 8以此类推。四、平衡二叉树AVL强迫症患者的树定义在 BST 基础上要求任意节点的左右子树高度差不超过 1。如何维持平衡插入或删除节点后通过“旋转”操作左旋、右旋、左右旋、右左旋使树重新满足平衡条件。优点查找效率稳定在 O(log n)最坏情况也不会退化。缺点插入和删除时的旋转成本较高频繁写操作时性能不如红黑树。应用场景适用于读多写少的场景例如数据库中的内存索引结构但实际中 B 树更常见。Windows 内核中的一些管理结构使用了 AVL。开发者感知你几乎不会直接写 AVL 代码但它是理解红黑树和 B 树的重要前导知识。五、红黑树HashMap 中的“隐形守护者”定义一种自平衡的二叉查找树通过颜色标记红/黑和一组规则来维持大致平衡而不是严格的高度平衡。红黑树的 5 条核心规则每个节点是红色或黑色。根节点是黑色。所有叶子节点NIL是黑色。红色节点的两个子节点都是黑色即不能有连续的两个红色节点。从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。为什么用红黑树而不是 AVL红黑树不追求“绝对平衡”只要求“黑色平衡”。它的旋转次数比 AVL 少插入/删除性能更好查找性能略逊于 AVL 但差距不大。因此在频繁写入的场景下红黑树是更好的选择。你在哪里见过它HashMap当链表长度超过 8 且数组长度 ≥ 64 时链表转换为红黑树防止哈希冲突严重时查询效率恶化。TreeMap / TreeSet整个底层实现就是红黑树。Linux 内核的调度器、C STL 的std::map。六、B树为磁盘而生的“矮胖子”定义一种多路搜索树每个节点可以拥有多个子节点通常几十到几千个而不是二叉树的“二”。核心特点一个节点可以存储多个键值比如 100 个。所有叶子节点位于同一层。数据分布在所有节点中内部节点也存数据。为什么需要 B 树内存和磁盘的 I/O 速度差距巨大毫秒 vs 纳秒级别。二叉树的每个节点可能对应一次磁盘 I/O树高几层就要读几次磁盘。B 树通过降低树高大幅减少磁盘 I/O 次数。应用场景文件系统如 NTFS、ext4和早期数据库索引。七、B树MySQL 索引的真正王者定义B 树的变种核心区别内部节点只存储键不存储数据所有数据都存储在叶子节点。叶子节点之间用链表连接支持范围查询和顺序扫描。为什么 MySQL 选择 B 树而不是 B 树更低的树高内部节点不存数据可以放更多键树更“胖”I/O 次数更少。范围查询高效找到范围起点后沿着叶子链表顺序遍历即可无需反复回溯父节点。数据稳定性所有数据都在叶子节点查询任何数据的 I/O 次数相同等于树高。你在哪里见过它MySQL InnoDB 引擎的索引主键索引、二级索引。PostgreSQL 的默认索引。几乎所有关系型数据库的 B 树索引。八、横向对比一张表说清所有区别九、日常开发中你其实一直在“用”它们你可能觉得自己没写过树但以下场景每一处都是树的功劳MySQL 查询优化当你创建索引CREATE INDEX idx_name ON user(name)MySQL 就在 B 树上维护了 name 的有序结构。查询WHERE name LIKE 张%时B 树的范围扫描能力让它瞬间返回结果。HashMap 的高性能当哈希冲突严重时红黑树避免了链表 O(n) 的查询退化。你完全无感知但这是 Java 8 之后 HashMap 能应对大规模冲突的关键。TreeMap 的有序性TreeMapString, Integer让你可以按 key 顺序遍历底层就是红黑树在维护顺序。数据库分页查询LIMIT 10 OFFSET 10000在大数据量下慢就是因为需要跳过前 10000 条。B 树的叶子链表可以快速定位 offset但优化后仍然不如基于游标的分页。文件系统的目录结构虽然看起来是文件夹但很多现代文件系统内部使用 B 树或变种来管理文件元数据。十、总结从“一棵树”到“一片森林”回到开头的问题为什么我们很少直接写树却离不开树因为树结构解决的是“在大量数据中快速查找”这一永恒问题。业务开发中我们更关注逻辑而把“查找”交给了数据库、集合框架、操作系统。它们底层都有一片“树之森林”在默默工作。最后送你三句话理解树的演变就是理解计算机从“内存友好”到“磁盘友好”的演进史。不会手写红黑树没关系但要知道它为什么比链表强、比 AVL 更适合工程。下次面试官问“为什么 MySQL 用 B 树”你能从磁盘 I/O、范围查询、树高三个维度回答就算真正懂了。

相关文章:

藏在底层的“树之家族”:从二叉树到B+树,你天天用却未必懂

写在前面“二叉树、二叉查找树、平衡二叉树、红黑树、B树、B树……这些数据结构,我好像只在课本上见过。平时写业务代码,一个ArrayList、HashMap走天下,谁没事自己写树啊?”这是很多后端开发者的真实想法。包括我自己,…...

平时没感觉突然痛到动不了,颈椎病腰间盘突出早有潜伏信号,成因症状与防护干货速收藏

很多人觉得颈腰椎病是 "慢性病",会慢慢加重,却不知道它常常以 "突然爆发" 的形式出现。 不少患者前一天还正常工作生活,第二天就突然颈痛难忍、腰痛到无法下床,这其实是因为疾病早已在体内潜伏多年&#xff…...

身份证校验码的奥秘:从算法原理到实际应用

1. 身份证号码的结构解析 每次填写身份证号码时,你有没有好奇过这串数字背后的含义?其实这18位数字就像一个人的数字档案,每一段都藏着特定信息。前6位是地址码,相当于你的户籍所在地的"邮政编码"。接着的8位是出生日期…...

奶奶都能看懂的 C# —— 手把手 LINQ懈

一、 什么是 AI Skills:从工具级到框架级的演化 AI Skills(AI 技能) 的概念最早在 Claude Code 等前沿 Agent 实践中被强化。最初,Skills 被视为“工具级”的增强,如简单的文件读写或终端操作,方便用户快速…...

生态研究者的数据工具箱:如何高效获取并利用全国自然保护区边界shp文件

生态研究者的空间数据实战:从自然保护区边界到科学决策的全流程解析 清晨的阳光透过实验室窗户洒在电脑屏幕上,生态学家林教授正在为即将开展的生物多样性研究项目准备基础数据。她深知,精确的自然保护区边界数据是这项研究的基石——它不仅关…...

MySQL进程监控与优化:高效查询与资源释放指南

1. MySQL进程监控基础:从入门到精通 刚接触MySQL数据库管理时,我最头疼的就是遇到服务器突然变慢的情况。后来才发现,学会查看和管理MySQL进程是解决问题的关键第一步。就像医院里的监护仪能显示病人生命体征一样,MySQL也提供了多…...

模拟退火遗传算法路径优化

模拟退火遗传算法 模拟退火遗传算法是将模拟退火算法的概率突跳特性,与遗传算法的群体搜索机制相结合的混合智能优化算法,目的是平衡全局搜索能力与局部寻优精度,避免单一算法易陷入局部最优的问题。 基础原理拆解 1. 遗传算法的底层逻辑 遗传算法借鉴自然选择与基因遗传…...

Java Stream API 的底层逻辑

Java Stream API的底层逻辑探秘 Java Stream API自Java 8引入后,彻底改变了集合操作的方式。它通过声明式编程风格,将复杂的迭代逻辑简化为链式调用,同时隐藏了底层实现的复杂性。但Stream并非简单的语法糖,其背后融合了惰性求值…...

电磁暴露与场域隐身理论

——兼论人类通讯升维对外星文明探测与UFO现象的直接影响 一、核心立论 1. 人类当前主流通讯电磁波广播模式,本质是电磁场二维切片辐射,与爱迪生发明的电灯泡在物理底层完全同源,属于低维、暴露、高能耗的“宇宙灯塔行为”。 2. 高级星际文明…...

算法面试常见题型分类

算法面试常见题型分类指南 在技术面试中,算法能力是考察候选人逻辑思维和问题解决能力的重要环节。无论是校招还是社招,算法题往往是筛选候选人的关键门槛。掌握常见的题型分类,能够帮助面试者高效准备,提升解题能力。本文将介绍…...

兼容FX3U源码的大神级编程资料:增加以太网下载功能,支持MODBUS-TCP与定位指令集

18650锂电池高温热失控引言 在工业控制、汽车电子和分布式系统领域,CAN(Controller Area Network)总线因其高可靠性、实时性和抗干扰能力而成为首选通信协议。本文深入分析基于STM32F10x微控制器的CAN网络通信模块,重点解析其如何…...

用户遇到了Docker镜像拉取超时的问题。我需要提供故障排除和解决方案。

你遇到的 Client.Timeout exceeded while awaiting headers 错误,核心原因是网络连接不稳定。虽然你已经配置了加速器,但从报错看,问题很可能就出在这个加速器地址上。 ⚠️ 配置了镜像源,为何还会超时? 这其实是个很常…...

仅限SITS2026参会者内部流通的NLP架构迁移Checklist(含自动校验脚本),现在获取倒计时72小时

第一章:SITS2026演讲:AI原生自然语言处理 2026奇点智能技术大会(https://ml-summit.org) AI原生自然语言处理(AI-Native NLP)标志着范式迁移的完成——模型不再被“适配”到任务,而是从设计之初即以任务语义、推理闭环…...

音视频AI工程化最后一公里(SITS2026原生框架实测报告:FFmpeg vs WebAssembly vs 原生Kernel Mode)

第一章:音视频AI工程化最后一公里的挑战与SITS2026原生框架定位 2026奇点智能技术大会(https://ml-summit.org) 在音视频AI大规模落地过程中,“最后一公里”并非指部署时长或物理距离,而是指模型能力与真实业务场景之间不可忽视的语义鸿沟—…...

基于springboot+vue红色教育基地管理系统hx0944FHZG

文章目录详细视频演示技术介绍功能介绍核心代码系统效果图源码获取详细视频演示 文章底部名片,获取项目的完整演示视频,免费解答技术疑问 技术介绍 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomca…...

为什么92%的AI团队还在用传统Scrum硬扛?:揭秘LLM驱动开发下的3层敏捷解耦新模型

第一章:AI原生软件研发敏捷开发方法适配 2026奇点智能技术大会(https://ml-summit.org) AI原生软件的研发范式正从根本上挑战传统敏捷开发的边界——模型迭代、数据漂移、提示工程验证与系统级可观测性耦合,使Scrum的固定Sprint节奏与用户故事拆分逻辑面…...

基于springboot+vue好漂酿自助美甲管理系统hx0749FECS

文章目录详细视频演示技术介绍功能介绍核心代码系统效果图源码获取详细视频演示 文章底部名片,获取项目的完整演示视频,免费解答技术疑问 技术介绍 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomca…...

OpenCASCADE与CMake实战:从零搭建Visual Studio 2019开发环境

1. 环境准备:搭建OpenCASCADE开发环境的基础条件 在开始配置OpenCASCADE项目之前,我们需要确保开发环境已经具备所有必要的工具和依赖项。这就像盖房子前需要准备好砖块、水泥和图纸一样,缺少任何关键组件都会导致后续工作无法顺利进行。 首先…...

从TwinCAT配置到Simulink-Realtime:打通松下伺服EtherCAT实时控制的实践指南

1. 为什么需要打通TwinCAT和Simulink-Realtime 在工业自动化领域,EtherCAT因其出色的实时性能和灵活的拓扑结构,已经成为伺服控制的首选通信协议。而将TwinCAT与Simulink-Realtime结合使用,可以充分发挥两者的优势:TwinCAT提供专业…...

3种实用方法:使用MediaCreationTool.bat绕过Windows 11硬件限制完全指南

3种实用方法:使用MediaCreationTool.bat绕过Windows 11硬件限制完全指南 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationT…...

地理数据处理不再复杂:3分钟掌握Mapshaper核心技巧

地理数据处理不再复杂:3分钟掌握Mapshaper核心技巧 【免费下载链接】mapshaper Tools for editing Shapefile, GeoJSON, TopoJSON and CSV files 项目地址: https://gitcode.com/gh_mirrors/ma/mapshaper 你是否曾因处理Shapefile时遇到文件过大而卡顿&#…...

别再只会用DS18B20了!用STM32+PT100搭建高精度测温系统,从电桥原理到代码实现的深度解析

STM32PT100高精度测温系统:从电桥设计到代码优化的全链路实践 在工业控制、实验室设备和精密制造领域,温度测量的准确性往往直接影响产品质量和生产效率。虽然DS18B20等数字温度传感器因其即插即用特性广受欢迎,但当测量精度要求达到0.3℃甚至…...

实时行情系统设计:从协议选择到高可用架构,再到数据源选型乌

一、核心问题及解决方案(按踩坑频率排序) 问题 1:误删他人持有锁——最基础也最易犯的漏洞 成因:释放锁时未做身份校验,直接执行 DEL 命令删除键。典型场景:服务 A 持有锁后,业务逻辑耗时超过锁…...

软件相关方管理中的利益协调方法

在软件开发过程中,相关方管理是确保项目成功的关键因素之一。由于不同相关方(如客户、开发团队、供应商、管理层等)的利益诉求可能存在冲突,如何有效协调各方利益成为项目管理的核心挑战。利益协调方法不仅能够减少矛盾&#xff0…...

AI Agent Harness Engineering 技术白皮书解读:核心概念与技术架构全景图

AI Agent Harness Engineering 技术白皮书解读:核心概念与技术架构全景图 关键词 AI Agent(智能体) Harness Engineering(工程框架) 多智能体系统 认知架构 工具调用链 记忆管理 决策引擎 摘要 随着人工智能技术的快速发展,AI Agent(智能体)正在成为下一代AI应用的核…...

Refined Now Playing:重塑网易云音乐播放体验的终极视觉革命

Refined Now Playing:重塑网易云音乐播放体验的终极视觉革命 【免费下载链接】refined-now-playing-netease 🎵 网易云音乐沉浸式播放界面、歌词动画 - BetterNCM 插件 项目地址: https://gitcode.com/gh_mirrors/re/refined-now-playing-netease …...

AI开发-python-langchain框架(--word文档加载 )喝

AI训练存储选型的演进路线 第一阶段:单机直连时代 早期的深度学习数据集较小,模型训练通常在单台服务器或单张GPU卡上完成。此时直接将数据存储在训练机器的本地NVMe SSD/HDD上。 其优势在于IO延迟最低,吞吐量极高,也就是“数据离…...

ESP32 GSM模块FOTA固件升级方案

1. 项目概述GSM_FirmwareUpdater 是一个面向嵌入式开发者的固件空中升级(FOTA, Firmware Over-The-Air)轻量级软件包,专为基于 ESP32 平台、具备 GSM/4G 模块(如 SIM800L、SIM7600、EC20、BG96 等)的物联网终端设备设计…...

嵌入式VGM音频库:轻量级芯片级音源仿真与实时播放

1. 项目概述Video Game Music Library(简称 VGM-Lib)是一个专为嵌入式平台设计的轻量级音频播放库,核心目标是精准复现经典街机与家用游戏机时代的数字音频——特别是基于 SN76489、YM2413、YM2612、RF5C164 等经典音源芯片的原始音色。该库不…...

JAVA找出哪个类import了不存在的类辣

一、中间件是啥?咱用“餐厅”打个比方 想象一下,你的FastAPI应用是个高级餐厅。 ?? 顾客(客户端请求)来到门口。- 迎宾(CORS中间件):先看你是不是从允许的街区(域名)来…...