B树B+树基础
二叉搜索树
二叉查找树,也称二叉搜索树、二叉排序树。其定义如下:
要么是一颗空树,要么是具有如下性质的二叉树:
- 若任意节点的左子树不空,则左子树上所有结点的值小于根节点;
- 若任意节点的右子树不空,则左子树上所有结点的值大于根节点;
- 任意节点的左、右字数也分别为二叉搜索树;
- 没有键值相等的节点;
平衡二叉树
平衡树是二叉搜索树和堆合并构成的新数据结构,所以它的名字取了Tree和Heap各一半,叫做
Treap
。
它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
平衡因子:若平衡因子的取值为-1、0或1时,该节点是平衡的,否则是不平衡的。
最低不平衡点:若节点x
是最低不平衡点,则其所有子节点是平衡的,而x
的祖先节点可能是不平衡的。
假设本来这棵树是平衡的,在我们在插入一个结点x
以后,导致了这棵树的不平衡。
LL
,插入的节点x
为左子树的左孩子LR
,插入的节点x
为左子树的右孩子RL
,插入的节点x
为右子树的左孩子RR
,插入的节点x
为右子树的右孩子
红黑树
红黑树是一种特化的
AVL
树,都是在进行插入和删除操作时通过特定操作保持BST
的平衡,从而获得较高的查找性能。
在二叉查找树的强制要求以外,对于任何有效的红黑树我们增加了如下的额外要求:
- 结点是红色或黑色。
- 根节点黑色。
- 不可能有连在一起的红色节点(每个红色节点的两个子节点都是黑色)。
- 叶子节点(
nil
或空节点)是黑色。
这些约束强制了红黑树的关键性质:从根到叶子的最长可能路径不多于最短可能路径的两倍长。结果是这个树大致上是平衡的。
平衡二叉树为了维护树的平衡,在一旦不满足平衡的情况下就要进行自旋,但是自旋会消耗一定的系统资源,因此红黑树在自旋造成的系统开销和减少查询次数之间作了权衡,有时候红黑树并不是一颗平衡二叉树。
红黑树已经是在查询性能上得到了优化,但是索引并没有使用红黑树来最为数据结构存储数据,因为红黑树在每一层上存放的数据内容是有限的,导致数据量一大(海量),树的深度就变得非常大,查询性能会非常查。
B树
B树中所有结点中孩子结点个数的最大值称为B树的阶,通常用m
表示,从查找效率考虑,一般要求。一棵m
阶B树是一棵空树或者是满足以下条件的m
叉树:
-
每个结点最多有
m
个分支(子树); -
若为根节点且根节点不是叶子结点,则至少要有两个分支;非根非叶结点至少有
(m + 1)/ 2
个分支; -
如果一个结点有
n-1
个关键字,那么该结点有n个分支。这n-1
个关键字按照递增顺序排列; -
每个结点的结构为:
n …… …… - n是指节点中关键字的个数
- 为该节点的关键字且满足
- 为该节点的孩子结点且满足所指结点上的关键字大于且小于
-
节点内各关键字互不相等且按从小到大排列
-
叶子结点处于同一层,可以用空指针表示
B+树
- 只有叶子结点存放键和值,非叶子结点只会冗余叶子结点的键(只有叶子结点存放数据)
- 相邻叶子结点之间是通过链表指针连起来的,按从小到大排列,提高区间访问速度
- 查找的时间复杂度约为:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人