RBTree/BTree/B+Tree

树,二叉树,二叉搜索树,平衡二叉树(红黑树),B树(多叉树)

1. 红黑树

1.1 红黑树的性质

RBTree/BTree/B+Tree_第1张图片
红黑树本身就是一颗二叉搜索树,只不过给他添加了很多的限制
红黑树的性质如下:

  • 根节点是黑色
  • 不存在两个红色节点相连的情况
  • 每个节点不是红色就是黑色
  • 所有的叶节点(NiL)都是黑色

1.2 变换规则

RBTree/BTree/B+Tree_第2张图片

2. B树(B-Tree)

  1. B树和B+树的插入、删除图文详解
  2. B站一个非常详细的讲解视频

B树(也称B-树和N叉树)和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径不只两个),数据库索引技术里大量使用者B树和B+树的数据结构

2.1 B树的特点

生成的B树中并非说每个结点都是满的。
(1)排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则;

(2)子节点数:非叶节点的子节点数>1,且<=M ,且M>=2,空树除外(注:M阶代表一个树节点最多有多少个查找路径,M=M路,当M=2则是2叉树,M=3则是3叉);

(3)关键字数:枝节点的关键字数量大于等于ceil(m/2)-1个且小于等于M-1个(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2);

第(3)条的意思就是:分裂的时候从中间分开,分成两颗子树。B树的分裂是向上分裂,就是如果当前结点没有存储空间了就向上分裂并和上一个结点进行合并。

(4)所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子;

RBTree/BTree/B+Tree_第3张图片

2.2 B树的查询流程

如上图我要从上图中找到E字母,查找流程如下

(1)获取根节点的关键字进行比较,当前根节点关键字为M,E

(2)拿到关键字D和G,D

(3)拿到E和F,因为E=E 所以直接返回关键字和指针信息(如果树结构里面没有包含所要查找的节点则返回null);

2.3 B树的插入节点流程

定义一个5阶树(平衡5路查找树;),现在我们要把3、8、31、11、23、29、50、28 这些数字构建出一个5阶树出来;

如果要创建一个5(M)阶的B树,那么他的指针最多只有5(M)个,关键字最多只有4(M-1)个

遵循规则:
(1)节点拆分规则:当前是要组成一个5路查找树,那么此时m=5,关键字数必须<=5-1(这里关键字数>4就要进行节点拆分);
(2)排序规则:满足节点本身比左边节点大,比右边节点小的排序规则;

先插入 3、8、31、11
RBTree/BTree/B+Tree_第4张图片
再插入23、29
RBTree/BTree/B+Tree_第5张图片
再插入50、28
RBTree/BTree/B+Tree_第6张图片

2.4 B树节点的删除

规则:
(1)节点合并规则:当前是要组成一个5路查找树,那么此时m=5,关键字数必须大于等于ceil(5/2)(这里关键字数<2就要进行节点合并);
(2)满足节点本身比左边节点大,比右边节点小的排序规则;
(3)关键字数小于二时先从子节点取,子节点没有符合条件时就向向父节点取,取中间值往父节点放;
RBTree/BTree/B+Tree_第7张图片

3. B+树

B+树和B树的区别

  1. B+树的叶子结点连接起来了,引入了双向链表;(双向链表是为了解决范围查找的问题)
  2. 非叶子结点不存储数据
  3. 整颗书的结点和数据的数量一样多
  4. B+树分裂的时候是把当前结点中最大的数字copy一份向上移(也就是说当前结点仍然包括最大的那个数字),但是B树是把中间的数字上移(当前结点不再包括这个被移出去的数字)

RBTree/BTree/B+Tree_第8张图片

RBTree/BTree/B+Tree_第9张图片

4. 总结

RBTree/BTree/B+Tree_第10张图片

你可能感兴趣的:(数据结构)