树的探索之旅(二叉树、平衡二叉树、红黑树、B树、B+树)

树的探索之旅


树生成器

学习心得

  • 不同的树有着不同的功能,核心的功能就是快速查询
  • 而我们要学习的是树的结构和结构带来的便捷查询逻辑
  • 所谓调整平衡的算法只是为了保证树形符合自身规定的性质/特征(本质上没有固定的调整算法)

二叉树(树的基础形态)

更详尽的描述参考:https://baike.baidu.com/item/%E4%BA%8C%E5%8F%89%E6%A0%91/1602879?fr=aladdin

其他参考文档:http://data.biancheng.net/view/192.html

术语

  • 结点:包含一个数据元素及若干指向子树分支的信息
  • 结点的度:一个结点拥有子树的数目称为结点的度
  • 叶子结点:也称为终端结点,没有子树的结点或者度为零的结点
  • 分支结点:也称为非终端结点,度不为零的结点称为非终端结点
  • 深度:也称为树的高度,树中最大层数
  • 度:子分支数

sy

性质

  1. 第 i 层最多有 2 i − 1 2^{i-1} 2i1 个结点

    如:第5层最多16个( 2 4 2^{4} 24

  2. 共 i 层,最多结点数为 2 i − 1 2^i-1 2i1 个结点

    如:共5层最多31个( 2 5 − 1 2^5-1 251

  3. 叶子结点数(i)永远比度为2的分支结点数(j)多一个

    如:18个叶子结点就会有17个度为2分支结点

满二叉树

sy

完全二叉树

sy

平衡二叉树(AVL)

所谓不平衡:左子树与右子树的深度差最大为1

之所以需要平衡

普通二叉树在某种排列下会导致形成连表结构,从而失去了树的意义(如图)。

sy

平衡调整算法

左旋

sy

右旋

sy

左右旋
  • 适用于左子结点右边深度比左边大(如图)

sy

右左旋
  • 适用于右子结点左边深度比右边大(如图)

sy

红黑树

个人理解

基于平衡树,红黑树相对于平衡树的平衡程度更严格,也就是平衡调整的复杂度提高了,但是确保了查询的效率,适合数据量大

术语

  • NIL:空的叶子结点

特性

  1. 根结点是黑色
  2. 每个叶子结点都是黑色的空结点(NIL节点)
  3. 红色结点的子结点是黑色的(因特性5的约束,该特性可以理解为红黑交替
  4. 新插入的结点是红色的
  5. 每条通往叶子结点(NIL)的路径所包含的黑色结点数一样

sy

调整算法

换色
  • 补充一下: 7 是新插入的结点

sy

旋转(和平衡树一样)

sy

B树(B-树)

术语

  • 阶:决定结点最大度数,同时也限制结点中值的个数(最少3阶)

sy

性质

  1. 一个结点可存储多个值(指定的阶数之内)
  2. 阶的取值大小取决于磁盘页大小
  3. 结点里的值从小到大排序
  4. 所有叶结点深度相同,就是树的高度
  5. 分支结点的度数是自身值个数+1
  6. 分支节点至少存在容量一半以上个值(容量为奇数时向下取整)

插入流程(结点分裂)

sy

删除流程(兄弟补位、结点合并)

兄弟补位

sy

结点合并(无法补位的情况下使用)

sy

B+树

李大爷遇到的疑惑(两个B+树?)

李大爷不是科班出身,之前并没有在书上看到过树结构的数据类型,所以这篇文档全靠百度。
而百度却给出了两个B+树结构,还都有相关文档和说明,顿然有股平行时空的科幻感(开始怀疑人生)。

揭晓答案:因为 mysql 的B+树实现是经过特殊改造的,因此就出现了【mysql 定制版】【B树升级版】(名字时李大爷起的,答案是某线上学习机构老师的解释)



mysql 定制版

性质

在B树的基础上有如下调整:

  1. 叶子结点才存储数据,其他节点都是索引(叶子结点包含了其他节点的值)
  2. 与B树不同,结点中值的数量等于度的数量
  3. 每个叶子结点之间都有一个指针指向右边的叶子结点
  4. 叶子结点外所有结点只记录子结点的最小值(有的是最大值)作为索引

sy

插入流程(编的,希望有看过源码的大佬可以指正一下)

sy

删除流程(等知道正确答案了再补上)


B树升级版

性质

在B树的基础上有如下调整:

  1. 叶子结点才存储数据,其他节点都是索引(叶子结点包含了其他节点的值)
  2. 每个叶子结点之间都有一个指针指向右边的叶子结点

sy

插入流程

sy

删除流程
索引覆盖

sy

兄弟补位

xdbw

结点合并

sy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值