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>=3\)。一棵m阶B树是一棵空树或者是满足以下条件的m叉树:
-
每个结点最多有
m个分支(子树); -
若为根节点且根节点不是叶子结点,则至少要有两个分支;非根非叶结点至少有
(m + 1)/ 2个分支; -
如果一个结点有
n-1个关键字,那么该结点有n个分支。这n-1个关键字按照递增顺序排列; -
每个结点的结构为:
n \(K_1\) \(K_2\) …… \(K_n\) \(P_0\) \(P_1\) \(P_2\) …… \(P_n\) - n是指节点中关键字的个数
- \(K_i\)为该节点的关键字且满足\(K_i < K_{i+i}\)
- \(P_i\)为该节点的孩子结点且满足\(P_i\)所指结点上的关键字大于\(K_{i-1}\)且小于\(K_{i+1}\)
-
节点内各关键字互不相等且按从小到大排列
-
叶子结点处于同一层,可以用空指针表示

B+树
- 只有叶子结点存放键和值,非叶子结点只会冗余叶子结点的键(只有叶子结点存放数据)
- 相邻叶子结点之间是通过链表指针连起来的,按从小到大排列,提高区间访问速度
- 查找的时间复杂度约为:\(O(log_m)\)


浙公网安备 33010602011771号