红黑树、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)
相关推荐
yzlAurora7 小时前
删除链表倒数第N个节点
数据结构·链表
进击的小白菜7 小时前
如何高效实现「LeetCode25. K 个一组翻转链表」?Java 详细解决方案
java·数据结构·leetcode·链表
拾忆-eleven7 小时前
C++算法(19):整数类型极值,从INT_MIN原理到跨平台开发实战
数据结构·c++·算法
我是一只鱼02239 小时前
LeetCode算法题 (反转链表)Day17!!!C/C++
数据结构·c++·算法·leetcode·链表
ice___Cpu12 小时前
数据结构 - 10( B- 树 && B+ 树 && B* 树 4000 字详解 )
数据结构
SuperCandyXu12 小时前
004 树与二叉树:从原理到实战
数据结构·算法
繁星蓝雨13 小时前
Qt中数据结构使用自定义类————附带详细示例
数据结构·c++·qt·qmap·qset
士别三日&&当刮目相看13 小时前
数据结构*二叉树
数据结构
喝养乐多长不高14 小时前
数据结构--红黑树
java·数据结构·算法·红黑树·二叉搜索树·avl树
阿沁QWQ14 小时前
list的设计
数据结构·list