红黑树、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)
相关推荐
GZX墨痕26 分钟前
从零学习直接插入排序
c语言·数据结构·排序算法
Susea&30 分钟前
数据结构初阶:双向链表
c语言·开发语言·数据结构
Net_Walke1 小时前
【C数据结构】 TAILQ双向有尾链表的详解
c语言·数据结构·链表
_x_w1 小时前
【17】数据结构之图及图的存储篇章
数据结构·python·算法·链表·排序算法·图论
冠位观测者2 小时前
【Leetcode 每日一题】2176. 统计数组中相等且可以被整除的数对
数据结构·算法·leetcode
飞天狗1113 小时前
数据结构——二叉树
数据结构·算法
巴巴_羊5 小时前
Layout 路由
数据结构
柯ran7 小时前
数据结构|排序算法(三)选择排序 堆排序 归并排序
数据结构·算法·排序算法
无敌的牛7 小时前
滑动窗口209. 长度最小的子数组
数据结构·算法
挽天java7 小时前
数据结构习题--岛屿数量
数据结构