红黑树、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)
相关推荐
CSharp精选营5 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假8 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠9 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦16 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠17 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾17 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82117 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q17 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒17 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记17 天前
单项不带头不循环链表
数据结构·链表