深入理解二叉树、B树与B+树:原理、应用与实现

数据结构之“树”——二叉树、红黑树、B树、B+树、B*树 这篇文章主要简单总结下二叉树、红黑树、B树、B+树、B*树的基本结构和原理。 阅读详情

在这里插入图片描述

引言

在计算机科学领域,数据结构是构建高效算法的基石。当我们需要处理大量数据时,选择合适的数据结构尤为重要。接下来我们将深入探讨三种重要的树形数据结构:二叉树、B树和B+树,分析它们的特性、应用场景 。

一、二叉树:基础而强大的结构

基本概念

二叉树是最基础的树形结构之一,每个节点最多有两个子节点(左子节点和右子节点)。在二叉搜索树(BST)中,数据按照特定规则组织:左子节点的值小于父节点,右子节点的值大于父节点。

特性分析

  • 时间复杂度:在平衡状态下,查找、插入和删除操作的时间复杂度为O(log n)
  • 内存结构:完全在内存中操作,适合数据量不大的场景
  • 简单直观:实现和理解都比较容易

Java实现

class BinaryTree {
    class Node {
        int value;
        Node left, right;
        
        public Node(int value) {
            this.value = value;
        }
    }
    
    Node root;
    
    // 插入方法
    public void insert(int value) {
        root = insertRec(root, value);
    }
    
    private Node insertRec(Node root, int value) {
        if (root == null) return new Node(value);
        if (value < root.value) root.left = insertRec(root.left, value);
        else root.right = insertRec(root.right, value);
        return root;
    }
    
    // 查询方法
    public boolean search(int value) {
        return searchRec(root, value);
    }
    
    private boolean searchRec(Node root, int value) {
        if (root == null) return false;
        if (root.value == value) return true;
        return value < root.value ? 
            searchRec(root.left, value) : 
            searchRec(root.right, value);
    }
}

应用场景

  • 内存中的小型数据集合排序和查找
  • 算法竞赛和面试题中的常见结构
  • 更复杂树结构(如AVL树、红黑树)的基础

二、B树:适合外存的多路平衡树

基本概念

B树是一种多路平衡查找树,设计初衷是为了减少磁盘I/O操作。与二叉树不同,B树的每个节点可以有多个子节点(通常数百个),节点中既存储键也存储值。

关键特性

  • 平衡性:所有叶子节点位于同一层次
  • 多子节点:一个节点可以有m个子节点(m阶B树)
  • 节点填充度:除根节点外,每个节点至少有⌈m/2⌉-1个键
  • 磁盘友好:节点大小通常设计为磁盘页大小

查询流程示例

考虑一个3阶B树查找键15的过程:

[10  20  30]
 ↓    ↓    ↓
... [12 15 18] ...
  1. 从根节点开始,发现15在10-20区间
  2. 进入中间子节点
  3. 在该子节点中找到键15

Java简化实现

class BTree {
    class BTreeNode {
        int[] keys;
        BTreeNode[] children;
        int numKeys;
        boolean isLeaf;
        
        public BTreeNode(int order, boolean isLeaf) {
            this.keys = new int[2*order-1];
            this.children = new BTreeNode[2*order];
            this.isLeaf = isLeaf;
        }
    }
    
    private BTreeNode root;
    private int order; // B树的阶
    
    public boolean search(int key) {
        return search(root, key);
    }
    
    private boolean search(BTreeNode node, int key) {
        int i = 0;
        while (i < node.numKeys && key > node.keys[i]) i++;
        
        if (i < node.numKeys && key == node.keys[i]) return true;
        if (node.isLeaf) return false;
        return search(node.children[i], key);
    }
}

典型应用

  • 文件系统(如NTFS、ReiserFS)
  • 某些数据库的索引实现
  • 需要大量磁盘读写的场景

三、B+树:数据库索引的首选

核心改进

B+树在B树基础上做了重要优化:

  1. 数据分离:所有数据只存储在叶子节点,非叶子节点仅作为索引
  2. 叶子链表:所有叶子节点通过指针连接形成有序链表
  3. 更高扇出:非叶子节点可以存储更多键,减少树高度

优势分析

  • 范围查询高效:通过叶子节点链表快速遍历
  • 更高的查询稳定性:任何查询都要走到叶子节点
  • 更适合磁盘存储:节点大小与磁盘块对齐

范围查询示例

查找10-20之间的所有键:

  1. 从根节点找到第一个≥10的键
  2. 到达叶子节点后,沿着链表向后遍历直到超过20
  3. 收集遍历过程中符合条件的所有键

Java简化实现

class BPlusTree {
    class Node {
        int[] keys;
        Node[] children;
        Node next; // 叶子节点的链表指针
        boolean isLeaf;
    }
    
    private Node root;
    
    public List<Integer> rangeSearch(int start, int end) {
        List<Integer> result = new ArrayList<>();
        Node curr = findLeaf(root, start);
        
        while (curr != null) {
            for (int key : curr.keys) {
                if (key > end) return result;
                if (key >= start) result.add(key);
            }
            curr = curr.next;
        }
        return result;
    }
    
    private Node findLeaf(Node node, int key) {
        while (!node.isLeaf) {
            int i = 0;
            while (i < node.keys.length && key > node.keys[i]) i++;
            node = node.children[i];
        }
        return node;
    }
}

实际应用

  • 关系型数据库(MySQL的InnoDB、Oracle等)
  • 非关系型数据库的索引实现
  • 需要高效范围查询的场景

四、三种数据结构对比

特性二叉树B树B+树
节点数据所有节点存储所有节点存储仅叶子节点存储
子节点数最多2个多个子节点多个子节点
查询复杂度O(log n)O(log n)O(log n)
范围查询需要中序遍历效率较低高效(链表)
磁盘友好度不适用较好最优
典型应用内存数据结构文件系统数据库索引

五、如何选择合适的结构

  1. 数据规模:

    • 小数据量(内存可容纳):考虑二叉树或其变种(AVL、红黑树)
    • 大数据量(需要磁盘存储):选择B树或B+树
  2. 查询模式:

    • 点查询为主:B树可能更高效
    • 范围查询频繁:B+树是更好的选择
  3. 系统特性:

    • 内存数据库:可以使用更简单的二叉树变种
    • 磁盘数据库:优先考虑B+树

六、总结

二叉树、B树和B+树各有其优势和适用场景。理解它们的差异和设计思想,有助于我们在实际开发中做出合理的选择。特别是对于数据库设计和性能优化,深入理解B+树的工作原理至关重要。

在这里插入图片描述

【MySQL进阶】深入理解B+树索引底层原理 阅读详情

相关推荐

深入理解数据结构中的树:从原理到高级应用的完整指南

printRow("AVL树", "O(log n)", "O(log n)", "O(log n)", "O(n)", "搜索密集型");printRow("B树", "O(log n)", "O(log n)", "O(log n)", "O(n)", "数据库索引");printRow("B+树", "O(log n)", "O(log n)", "O(log n)", "O(n)", "文件系统");"树类型", "搜索", "插入", "删除", "空间复杂度", "主要应用场景");

ysct_999的博客 4524

数据结构 —— B树

文章目录1、B树的定义1.1、B树的补充说明:1.2 、`B树` == `B-树` == `B-tree` == `B tree`的区别2、B树的插入操作下面以5阶B树为例,介绍B树的插入操作,3、 B树的删除操作下面以5阶B树为例,介绍B树的删除操作 1、B树的定义 B-tree 即 B树,B 即 Balanced,平衡的意思。 B树 是一颗多路平衡查找树。 我们描述一颗B树时需要指定...

猎人在吃肉 3万+

深入底层全图解-二叉树、BST树、AVL树、红黑树、B树、B+树

深入底层全图解-二叉树、BST树、AVL树、红黑树、B树、B+树

weixin_45198482的博客 1172

数据结构——B+树

B+树

weixin_52821814的博客 3万+

丰富图文详解B-树原理,从此面试再也不慌

本文始发于个人公众号:TechFlow,原创不易,求个关注 本篇原计划在上周五发布,由于太过硬核所以才拖到了这周五。我相信大家应该能从标题当中体会到这个硬核。 周五的专题是大数据和分布式,我最初的打算是和大家分享一下LSM树在分布式存储引擎当中的应用。但是想要能够真正深入理解了LSM的精髓,以及它构思巧妙的点,必须要对传统的数据库的B树和B+树有所了解。所以才有了今天的文章。 虽然我自己完整地将...

TechFlow的博客 1008

二叉树、红黑树、B树、B+树、图、Trie树合集-----妈妈再也不用担心我的“树”拉!

这里把各种树做个总结,分别介绍各个树是什么,什么原理,什么特点,什么情况下使用,另外很多时候它们很多地方是相似的,还要加以区别,之前我身边一个很多年开发的经验的老开发还以为B树、B-树、B+树是三种树,实际没有B-树,它实际就是B树,要是不区分清楚闹出这样的笑话就尴尬了。或者别人说“平衡树”、“满二叉树”、“3阶树”等概念时你一脸懵逼,想吹牛逼但是没词儿,那也挺尴尬,怎么办,一点一点学吧,下面一 一介绍。 一、树的基本术语 若一个结点有子树,那么该结点称为子树根的"双亲",子树的根是该结点的"孩子"

1100

经典树结构——B+树的原理及实现

文章目录B+树的概念B+树实现B+树节点参数B+树插入实现B+树删除实现 B+树的概念 规则: B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加 B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样 B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针 非叶子节点的子节点数=关键字数(来源百度百科)(Mysql 的B+树) B+树相比

c630843901的博客 5万+

深入理解平衡二叉树与B树的原理及应用

本文深入探讨了平衡二叉树的删除操作和旋转策略,包括L-1、R-1、L1、R1旋转的原理和应用,以及红黑树的定义和特性。接着,我们转而分析了二叉树的数量计算方法,特别是使用卡塔兰数来确定具有特定节点数量的二叉树的数量。最后,文章介绍了多路搜索树,特别是B树的结构、操作和实际应用,阐述了B树如何优化对磁盘等外部存储设备的读写效率。

weixin_29363791的博客 756

深入理解 B 树与 B + 树:从原理到数据库应用

B 树是一种平衡的多路查找树,它打破了二叉树的局限性,允许每个节点存储多个关键字和子节点指针,从而大幅降低树的高度,减少磁盘 IO 操作。B + 树是 B 树的变种,在保持平衡特性的基础上,对数据存储结构做了优化,更适合作为数据库索引。

开往1982的博客 1957

二叉搜索树、红黑树、AVL树与B树原理及应用详解

二叉搜索树(Binary Search Tree, BST)是一种基于二叉树的有序数据结构,其每个节点满足如下性质:左子树所有节点值小于当前节点值,右子树所有节点值大于当前节点值。该递归定义确保了中序遍历结果为严格递增序列。int val;这一结构性质使得查找、插入、删除操作可依据比较结果决定走向左或右子树,路径具有明确方向性,在理想平衡状态下时间复杂度为 $O(\log n)$。

weixin_42173218的博客 919

【商业化】【msix打包】Python 应用打包为 MSIX 的正确流程:入口点问题与解决方案

发现用msix打包工具打包python做的exe时总找不到程序入口点,后来理了一下才发现自己误会了,需要先生成一个基本的setup.exe,msix的打包是基于这个初始的安装程序进行的。只需要点击Buile-》Compile,然后Open Output Folder就可以得到exe安装程序了。可以使用免费工具inno setup来创建初始安装包。其中{group}这样的变量会自动匹配,不用自己指定。如果点击Run会运行安装程序。

每日出拳老爷子的博客 1098

深入理解数据库索引:为什么选择B+树而非二叉树?

B+树作为一种多叉树的变种,在数据库索引中具有更好的性能和适用性。B+树适用于大规模数据存储:由于B+树的存储空间利用率高、查询性能稳定,它更适用于大规模数据的存储和查询。B+树的存储空间利用率更高:B+树的内部节点不存储数据,只存储索引键和指向子节点的指针,因此存储空间利用率更高。B+树支持范围查询和顺序访问:B+树的叶子节点形成一个有序链表,可以支持范围查询和顺序访问,非常适合数据库的查询操作。B+树的查询性能更稳定:由于B+树的平衡性较好,插入和删除操作不会导致树的不平衡,因此查询性能相对稳定。

博客 1766

基于云平台的ATS系统微服务架构方案研究

在当前智慧地铁的升级转型过程中,城市轨道交通ATS系统面临着稳定性差、运维方 式繁琐和故障应急处理效率低等问题。为此,提出一种基于云平台的ATS系统微服务架构方案; 研究了ATS系统在云平台上的微服务总体架构、ATS应用的微服务划分和设计、容器部署方式 及通信交互模式,可实现系统松耦合和易扩展,达到节约计算资源、提高系统稳定性和运营效 率的目的

mi_lan1的博客 962

深入理解二叉树与堆:结构、实现与典型应用

树,二叉树(满二叉树,完全二叉树),实现顺序结构二叉树,两种调整算法,堆排序,Top-K问题

2502_91499791的博客 800

Shopee App加密算法逆向实战:从libshpssdk.so到x-sap-ri的生成机制

本文详细解析了Shopee App核心加密参数x-sap-ri的生成机制。通过逆向分析libshpssdk.so动态库,揭示了其采用9套算法动态切换的复杂签名逻辑,并分享了从抓包定位、Frida动态调试到Unidbg模拟执行的全过程实战经验,为移动应用安全研究提供了完整的技术路径。

weixin_29323551的博客 1322

10、现代统计方法:趋势面分析、薄板样条与广义线性模型

本文系统介绍了空间预测建模中的三种现代统计方法:趋势面分析(TSA)、薄板样条(TPS)和广义线性模型(GLM)。详细阐述了每种方法的原理、实现步骤、参数优化与预测评估,并结合R语言代码示例展示了在实际数据中的应用。文章还提供了方法对比流程图与土壤湿度预测案例,帮助读者根据数据特征选择合适模型,提升空间预测的准确性与可靠性。

play7的博客 152

深入解析:为什么数据库索引偏爱B+树而非二叉树?

一天一个小知识点,今天我们要探讨一个数据库领域的基础但至关重要的话题:索引数据结构的选择。就像城市交通规划需要精心设计道路网络一样,数据库也需要高效的数据结构来组织索引。那么,为什么主流数据库都选择了B+树而不是看似简单的二叉树呢?让我们一起来解开这个谜题。

从不水文,坚持创作,加油 1352

李宏毅2025《机器学习》第一讲-生成式AI:技术突破和未来发展

本文基于台湾大学李宏毅教授的“一堂课搞懂生成式人工智慧的技术突破与未来发展”课程内容,系统性地梳理了生成式AI的核心概念、技术原理、发展演进以及未来趋势。文章从AI的“行为”入手,通过生动的实例展示了其强大的生成与推理能力;进而深入剖析其底层运作机制,阐释了“万物皆为令牌(Token)”、自回归生成、Transformer架构等核心原理;接着,文章追溯了通用AI模型从“专才”到“通才”的演进历程;最后,探讨了如何通过微调(Fine-tuning)、模型编辑(Model Editing)等技术赋予AI新的能力

木鱼时刻的专栏 2288

深入理解二叉树及其变体:平衡二叉树、红黑树、B-树和B+树

本文将带您了解二叉树及其几种重要变体:平衡二叉树、红黑树、B-树和B+树。通过对这些数据结构的深入剖析,帮助您更好地理解它们的原理、特点及应用场景。

2403_87122583的博客 753

【WorkBuddy专栏40】从「帮你干活」到「帮你创造」——WorkBuddy设计创意功能深度拆解

【WorkBuddy专栏40】从「帮你干活」到「帮你创造」——WorkBuddy设计创意功能深度拆解

AI人人懂 1262

HDR 人像肤色稳定实战:AE/AWB/ToneMap 冲突解耦与优先级裁决

人像 HDR 最容易“翻车”的就是**肤色飘**:AE 抢亮度、AWB 拉白点、TM 又在肩部压高光,三方各自“对”却合起来“错”。本文给出一套**工程可落地**的裁决策略:以**肤色 ROI 锚点**为最高约束,AE 先对脸部入射照度收敛,AWB 在**肤色先验 + 光源模型**下缓变,TM 采用**色相保持 + 中灰/肤色双锚**且时域一致化。配套**阈值与回归**(ΔE00、亮度漂移 RMS、频闪注入),把“主观对”的口径落到**可度量**,并给出逆光、多脸、霓虹等极端场景的**例外分流**。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1174

深入理解(二叉树、平衡二叉树、B-Tree、B+Tree )的区别

一、背景 一般说MySQL的索引,都清楚其索引主要以B+树为主,此外还有Hash、RTree、FullText。本文简要说明一下MySQL的B+Tree索引,以及和其相关的二叉树、平衡二叉树、B-Tree,相关的知识网上很多,为了方便自己更快、清楚的了解,文本聚合一些内容以及个人的一些理解。 二、二叉查找树(BST) (1)概念: 二叉查找树是基于二分查找法来提高数据查找速度的二叉树的数据结构;关于二分查找法的时间复杂度可以看 时间复杂度 O(log n) 意味着什么?。 (2)特点 二叉查找树是采用二分查

嵌入式Linux内核的博客 3253

CLRNet车道线检测模型在Orin Nano Super开发板上的全栈部署与优化实践

本文详细介绍了将CLRNet车道线检测模型部署到NVIDIA Orin Nano Super开发板的全过程。内容包括:1) Orin开发板硬件规格分析;2) JetPack SDK环境配置与Python虚拟环境搭建;3) CLRNet模型架构解析与PyTorch实现;4) 模型转换与TensorRT加速优化方法。通过系统性的环境配置、模型转换和性能优化,为边缘计算场景下的车道线检测应用提供了完整的解决方案,实现了在Orin平台上的高效部署。

huanghm88的专栏 216

二叉树后序遍历:原理、实现与应用

本文介绍了二叉树后序遍历的原理、实现方法及应用场景。后序遍历按照左子树→右子树→根节点的顺序访问节点,适用于节点删除、深度计算等场景。实现方法包括递归法(直观但可能栈溢出)、迭代法(使用显式栈)和Morris遍历(空间高效)。后序遍历的时间复杂度为O(n),空间复杂度根据实现方式不同为O(h)或O(1)。其优点包括简单直观、适用性广和高效性,是二叉树操作中的重要基础算法。

你若盛开,清风自来 1228

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

深入理解索引和AVL树、B-树、B+树的关系

目录 什么是索引 索引的分类 索引和AVL树、B-树、B+树的关系 AVL树、红黑树 B-树 B+树 SQL和NoSQL索引 参考 什么是索引 索引时数据库的一种数据结构,数据库与索引的关系可以...

城志的学习笔记 687

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【C++高阶数据结构】B树、B+树、B*树

🏆​ 🌈⭐️⚡若有帮助可以【关注】,大家一起进步!

YQ20210216的博客 1102

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: Redisson - 分布式锁和同步器
下一篇: RAG - 五大文档切分策略深度解析
小小工匠
小小工匠 优质创作者: Java技术领域 优质创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄15年 15万+粉丝 2865原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值