红黑树、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)
相关推荐
想睡hhh3 分钟前
c语言数据结构——单向不带头不循环链表的实现
c语言·数据结构·链表
打不了嗝 ᥬ᭄21 分钟前
平衡树的模拟实现
数据结构·c++
泽020231 分钟前
数据结构之双向链表
数据结构
ChoSeitaku35 分钟前
NO.42十六届蓝桥杯备战|数据结构|算法|时间复杂度|空间复杂度|STL(C++)
数据结构·算法·蓝桥杯
代码AC不AC36 分钟前
【数据结构】顺序表(附源码)
c语言·数据结构·源码·顺序表·线性表
Vitalia3 小时前
图论入门【数据结构基础】:什么是树?如何表示树?
数据结构·算法·图论·
lisw053 小时前
【Python】数据结构有Python版吗?
数据结构·python
huangyuchi.3 小时前
map容器练习:使用map容器识别统计单词个数
开发语言·数据结构·c++·笔记·算法
半盏茶香4 小时前
启幕数据结构算法雅航新章,穿梭C++梦幻领域的探索之旅——二叉树序列构造探秘——堆的奥义与实现诗篇
android·数据结构·c++·python·算法·leetcode
Gazer_S4 小时前
【Auto-Scroll-List 组件设计与实现分析】
前端·javascript·数据结构·vue.js