当前位置:   article > 正文

红黑树 | 平衡二叉树 | B+树 | B树_b树中所有结点的平衡因子都为1

b树中所有结点的平衡因子都为1

漫画:什么是红黑树? - 知乎———————————— ———————————— 二叉查找树(BST)具备什么特性呢? 1. 左子树上所有结点的值均小于或等于它的根结点的值。2. 右子树上所有结点的值均大于或等于它的根结点的值。3.左、右子树…https://zhuanlan.zhihu.com/p/31805309

二叉查找树:

1.子树上所有结点的值均小于或等于它的根结点的值。

2.子树上所有结点的值均大于或等于它的根结点的值。

3.左、右子树也分别为二叉排序树。

二分查找的思想,查找所需的最大次数等同于二叉查找树的高度。

缺点:二叉查找树多次插入新节点导致不平衡。

 

 

红黑树:

是自平衡的二叉查找树,除了符合二叉查找树的基本特性外,还有以下特性:

1.节点是红色或黑色。

2.根节点是黑色。

3.每个叶子节点都是黑色的空节点(NIL节点)。

4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

红黑树从根到叶子的最长路径不会超过最短路径的2倍。

 怎么保证一棵红黑树始终是红黑树?变色和旋转,旋转分为左旋转和右旋转。

变色:

为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。

左旋转:

逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子。

 右旋转

逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子。

 

 平衡二叉树(AVL树):

遵循高度平衡,任何结点的两个子树高度差都不超过1。

在AVL树当中,我们通过“平衡因子”来判断一颗二叉树是否符合高度平衡。

对于AVL树的每一个结点,平衡因子是它的左子树高度和右子树高度的差值。只有当二叉树所有结点的平衡因子都是-1, 0, 1这三个值的时候,这颗二叉树才是一颗合格的AVL树。

下图就是一颗典型的AVL树,每个节点旁边都标注了平衡因子:

 

其中结点4的左子树高度是1,右子树不存在,所以该结点的平衡因子是1-0=1。

结点7的左子树不存在,右子树高度是1,所以平衡因子是0-1=-1。

所有的叶子结点,不存在左右子树,所以平衡因子都是0。

当AVL树插入或者删除节点的时候,平衡可能被打破。

 重新恢复AVL的平衡: 左旋转和右旋转

左旋转:

逆时针旋转AVL树的两个结点X和Y,使得父结点被自己的右孩子取代,而自己成为自己的左孩子。说起来有些绕,见下图(标号1,2,3的三角形,是结点X和Y的子树):

 

右旋转:

顺时针旋转AVL树的两个结点X和Y,使得父结点被自己的左孩子取代,而自己成为自己的右孩子。见下图:

 

B-树(就是B树,-不是减号,不可以读B减树)

漫画:什么是B-树? - 知乎

为什么MySQL索引用B+树?不用二叉查找树?

考虑磁盘IO。数据库索引是存储在磁盘上的,当数据量比较大的时候,索引的大小可能有几个G甚至更多。当我们利用索引查询的时候,不可能把整个索引都加载到内存,能做的只有逐个加载每个磁盘页,这里的磁盘页对应着索引树的节点。

最坏情况下,磁盘IO次数等于索引树的高度。 

为了减少磁盘IO次数,就要把原来“瘦高”的树变得“矮胖”。这就是B-树的特征之一。

B树是一种多路平衡查找树,它的每一个节点最多包含k个孩子,k被称为B树的阶。k的大小取决于磁盘页的大小。

一个m阶的B树具有如下几个特征:

1.根结点至少有两个子女。

2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m

3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m

4.所有的叶子结点都位于同一层。

5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

B-树主要用于文件系统及部分数据库索引,比如著名的非关系型数据库MongoDB。

大部分关系型数据库,比如MySQL,使用B+树作为索引。

B+树

漫画:什么是B+树? - 知乎

一个m阶的B+树具有如下几个特征:

1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。

2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

每一个父节点的元素都出现在子节点中,是子节点的最大或者最小元素。

根节点的最大元素等同于整个B+树的最大元素。

每一个叶子节点都带有指向下一个节点的指针,形成了一个有序链表。

 卫星数据:指的是索引元素所指向的数据记录,比如数据库中的某一行。

在B-树中,无论是中间节点还是叶子节点都带有卫星数据。

B-树中的卫星数据(Satellite Information):

在B+树中,只有叶子节点带有卫星数据,其余中间节点仅仅是索引,没有任何数据关联。

B+树中的卫星数据(Satellite Information):

 

在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。

B+树的中间节点没有卫星数据,所以同样大小的磁盘页可以容纳更多的节点元素。这就意味着,数据量相同的情况下,B+树的结构比B-树更加矮胖。因此查询时磁盘IO次数更少。

B+树的查询必须最终查找到叶子节点,而B-树只要找到匹配元素即可,无论匹配元素处于中间节点还是叶子节点。因此B-树的查找性能并不稳定,最好情况是只查根节点,最坏情况是查到叶子节点。而B+树的每次查找都是稳定的。

综合起来,B+树相比于B-树的优势:

1. IO次数更少 2. 查询性能稳定 3. 范围查询简便。

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号