红黑树、B树、B+树基本原理

平衡二叉搜索树

  • 前提:二叉搜索数
  • (左子树高度 - 右子树高度)的绝对值 <= 1

旋转操作

左旋:冲突的左孩变右孩

右旋:冲突的右孩变左孩

LL型:右旋失衡节点

失衡节点平衡因子 = 2

失衡节点左孩平衡因子 = 1

RR型:左旋失衡节点

失衡节点平衡因子 = -2

失衡节点右孩平衡因子 = -1

LR型:左旋左孩子,右旋失衡节点

失衡节点平衡因子 = 2

失衡节点左孩平衡因子 = -1

RL型:右旋右孩子,左旋失衡节点

失衡节点平衡因子 = -2

失衡节点右孩平衡因子 = 1

看平衡因子:正数是L负数是R

++LL ±LR --RR -+RL

同时继续观察:L右旋,R左旋,LR和RL先旋转失衡的孩子,再旋转失衡的自身

LL自身右旋,RR自身左旋,LR(左右)孩子左旋,自身右旋,RL(右左)孩子右旋,自身左旋

插入节点后如果有多个祖先失衡,调整离插入节点最近的节点

红黑树

AVL的查询更高效,红黑树的插入和删除更高效,比如C++的map和set

  • 前提:是二叉搜索树(左< 根 <右) 左根右
  • 根和叶子(NULL)都是黑色的 根叶黑
  • 不存在连续的两个红色节点 不红红
  • 任意节点到叶所有路径的黑节点数量相同 黑路同

性质:最长路径不会超过最短路径的两倍,任意节点左右子树高度差不超过两倍

插入:

  • 插入的是根节点-----》 直接变黑
  • 插入节点的叔叔是红色---》叔父爷变色,爷爷变插入节点继续判定
  • 插入的叔叔是黑色---》(LL RR LR RL)(爷爷节点是最近的 失衡节点)旋转,变色

B树

对于计算机而言,磁盘访问速度相比于cpu是非常慢的,红黑树以及AVL树查找数据的时候,一层查找一次,层数一多,就非常耗时,于是B树就出现了,它可以看作是每个节点存储多个数据的平衡二叉树,定义如下:

  • 平衡:所有的叶结点都在同一层(高度相同)

  • 有序:节点内的数据是有序的,任意元素的左子树都小于他,右子树都大于他

  • 多路:m阶B树

    • 最多 :m个分支,m - 1个元素

    • 最少:

      • 根节点:两个节点,一个元素
      • 其他(m/2)个分支, (m/2) - 1个元素, (m/2 )向上取整

访问节点是在硬盘上进行的

节点内的查找是在内存中进行的,一般是顺序查找或者二分查找,效率差不多

构建:

  • 先查找插入的位置(一定落在叶节点)
  • 如果没有溢出,无需调整
  • 否则将中间元素(m / 2向上取整)上移,两边分裂

B+树

前面B树的查找是随机查找,遍历树的时候是中序遍历,效率比较低,B+树解决了这个问题

叶节点包含了B+树的所有元素,是一个链表(单向双向都有),每个元素的值就是表格的关键字key

非叶节点可以帮助叶子结点索引,快速定位到关键字,整套B+树是多级索引结构,加速查询速度

区别

  • B树所有节点的关键字都有只指向数据记录的指针
  • B+树叶子结点包含全部关键字以及指针非叶子结点只作为索引
  • B树m个分支有m- 1个关键字
  • B+树m个分支有m个关键字,每个索引是字节点中的最大值(这一点不一定,双向链表也有不是最大值,可以像B树一样组织树的结构,双向索引可以决定去左子树还是右子树)
  • B树顺序查找或者范围查找只能中序遍历
  • B+树兼顾顺序查找和随机查找,还可以进行范围查找

查找

  1. 顺序查找,直接遍历叶节点层的链表
  2. 随机查找,非叶节点作为索引,最终落到叶节点层
  3. 范围查找,先通过随机查找获取范围(10~ 50)的起始点(10),没有找到也没关系,找到叶子节点层的起始点(12),然后顺序查找到终止位置(46)
相关推荐
切糕师学AI4 小时前
环形缓冲区(Ring Buffer / Circular Buffer)详解:原理、优势、应用与高性能实现
数据结构·环形缓冲区
WolfGang0073214 小时前
代码随想录算法训练营 Day50 | 图论 part08
数据结构·算法·图论
晚枫歌F6 小时前
最小堆定时器
数据结构·算法
嫩萝卜头儿8 小时前
2 - 复杂度收尾 + 链表经典OJ
数据结构·算法·链表·复杂度
样例过了就是过了8 小时前
LeetCode热题100 分割等和子集
数据结构·c++·算法·leetcode·动态规划
木木_王9 小时前
嵌入式Linux学习 | 数据结构 (Day05) 栈与队列详解(原理 + C 语言实现 + 实战实验 + 易错点剖析)
linux·c语言·开发语言·数据结构·笔记·学习
北顾笙9809 小时前
day38-数据结构力扣
数据结构·算法·leetcode
m0_629494739 小时前
LeetCode 热题 100-----14.合并区间
数据结构·算法·leetcode
@小码农9 小时前
2026年3月Scratch图形化编程等级考试一级真题试卷
开发语言·数据结构·c++·算法
_日拱一卒11 小时前
LeetCode:226翻转二叉树
数据结构·算法·leetcode