B树(B-树或B_树)
最近需要了解B树的相关知识,故在此刨根问底从二叉查找树看起。并做以下记录。以下转自寒江独钓的博客。
1、二叉查找树
二叉查找树(Binary Search Tree)的定义如下:
- 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值。
- 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值。
- 任意节点的左右子树也分别为二叉查找树。
- 没有键值相等的节点。
2、2-3树
和二叉树不一样,2-3树运行的每个节点保存 1 个或者 2 个的值。对于普通的 2 节点,它保存一个 key 和左右两个子节点。对于 3 节点,它保存两个 key。2-3树的定义如下:
- 要么为空,要么满足以下条件。
- 对于 2 节点,该节点保存一个 key 及其对应的 value,以及两个指向左右节点的地址。左节点也是个2-3节点,所有的值都比 key 小,右节点也是一个2-3节点,所有的值都要比key大。
- 对于 3 节点,该节点保存两个 key 和其对应的 value,以及三个指向左中右节点的地址。左节点也是一个2-3节点,其中所有的值均要比当前节点的两个 key 值中最小的那个还要小。中间节点也是一个2-3节点,中间节点的 key 值要在当前节点中的两个 key 之间。右节点也是一个2-3节点,节点的 key 值要比当前节点的两个 key 中最大的那个还大。
3、红黑树
红黑树的主要是想对2-3数进行编码,尤其是对2-3树中的 3-nodes 节点添加额外的信息。红黑树中将节点之间的链接分为两种不同类型,红色链接,他用来链接两个2-nodes节点来表示一个3-nodes节点。黑色链接用来链接普通的 2-3 节点。特别的,使用红色链接的两个 2-nodes 来表示一个 3-nodes 节点,并且向左倾斜,即一个 2-node 是另一个 2-node 的左子节点。这种做法的好处是查找的时候不用做任何修改,和普通的二叉查找树相同。
红黑树是一种具有红色和黑色链接的平衡查找树,根据以上描述,红黑树定义如下:
- 红色节点向左倾斜。
- 一个节点不可能有两个红色链接。
- 整个树完全黑色平衡,即从根节点到所以叶子结点的路径上,黑色链接的个数都相同。
4、B树
1970年,R.Bayer 和 E.mccreight 提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树(或B-树、B_树)。一棵 M 阶 B 树(balanced tree of order m)是一棵平衡的 M 路搜索树。同时 B 树也可以看做是对 2-3 树的一种扩展,它允许每个节点至多有 M-1 个子节点。一个 M 阶的 B 树定义如下(出自数据结构C语言版-严蔚敏):
- 树中的每个节点至多有 m 棵子树(即每个非节点至多有 m - 1 个 key)。
- 若根节点不是叶子节点,则至少有两棵子树。
- 除根节点之外的所有非终端节点至少有 ⌊m/2⌋ 棵子树(即每个非根节点所包含的关键字个数 j 满足: ⌊m/2⌋−1≤j≤m−1 。
- 所有的非终端节点包含下列信息数据( n,A0,K1,A1,...,Kn,An )。 其中 Ki 为关键字且 Ki≤Ki+1 。 Ai(i=0,...,n) 为指向子树根节点的指针。
- 所有的叶子节点都出现在同一层次上。