B树、B-树、B+树

首先说明:B树即为B-树。这个要特别注意!在本文中,我们不在提及B树,只说B-树和B+树

在说B-和B+树之前,先说一下二叉排序树。

一、 二叉排序树又称二叉查找树,有如下性质:

1)若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;

2)若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值;

3)它的左右子树也分别为二叉排序树。

《B树、B-树、B+树》《B树、B-树、B+树》

上图为一棵二叉排序树。通常二叉排序树用二叉链表作为存储结构。如下:

public class TreeNode {
	public int val;
	public TreeNode left;
	public TreeNode right;
}

       因为存储结构是链表,所以二叉排序树应该有链表应该有的特点。也就是增加元素和删除元素效率特别高,时间复杂度为o(1)。因为树中节点的值是有序的,因此查找效率也很高,类似于折半查找。与给定的元素的比较不超过树的深度。比如上面的树中我们找28,则只需寻找35-17-28,就能找到。然而折半查找长度为n的表得判定树是唯一的,而含有n个节点的二叉排序树却不唯一。如上图右侧所示,这里不再多做叙述。

      如上面所说,二叉排序树不是很稳定,有的情况它的查找效率很低。随机的情况下,二叉排序树的平均查找长度和log(n)是一个数量级的。因此提出了二叉平衡树。

二、平衡二叉树(balanced binary tree 或 height-balanced tree),又称AVL树。有如下性质:

1)左右子树的深度之差的绝对值不超过1

2)它的左子树和右子树都是平衡二叉树。

        那么怎么将二叉排序树变成一个平衡二叉树呢?或者给定一个序列怎么能够生成平衡二叉树呢?举个例子,给定序列(13,24,37,90,53)

《B树、B-树、B+树》

如上图,不在多解释,毕竟重点不是这个。平衡二叉树的查找时间复杂度是O(log n).

三、B-树和B+树

       B-树:是一种平衡的多路查找树,一颗m阶B-树,或为空树,或为满足下面要求的树。

       1)树中每个结点至多有m棵子树;

       2)若根节点不是叶子结点,则至少有两棵子树;

       3)除根之外的所有非终结端结点至少有m/2向上取整棵子树。意思是一个7阶的B-树,每个非终端结点至少有7/2=3.5向上取整 = 4棵子树。

       4)所有的非终端结点中包含下列信息数据(n,A0,K1,A1,K2,A2,…..,Kn,An),这里k是关键字,Ki < K(i+1),图中 43<78, 47<53<64;Ai为指向子树根节点的指针,并且有如下特点,A(i-1)所指子树中所有节点的关键字均小于Ki,An所指子树中所有节点的关键字均大于Kn,图中g中的值都小于43且大于78,n为关键字的个数。

《B树、B-树、B+树》

     5)所有的叶子结点都出现在同一层次上,并且不带信息。(可以看作是外部的结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)

四、B+树:B+树是B-树的一种变型。一棵m阶的B+树和m阶的B-树差异在于:

        1)有n棵子树的结点中含有n个关键字。(结点中有几个数字,就有几颗子树)

        2)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小由小到大顺序链接。(叶子结点是从小到大排列的)

        3)所有的非终端结点可以看成是索引部分,结点中仅含有其子树(根节点)中的最大(或最小)关键字。  

《B树、B-树、B+树》    

         B+树中有两个头指针,一个是指向根结点,另一个指向关键字最小的叶子结点。因此,可以对B+树进行两种查找运算:一种是从最小关键字起顺序查找,另一种是从根结点开始,进行随机查找。顺序查找跟数组类似。随机查找与B-类似,但是我觉得更像二叉排序树,只不过这里子节点包含了父节点中的关键字的信息。

        最后一句:  B+树有很多应用场景,例如mysql。

          


    原文作者:B树
    原文地址: https://blog.csdn.net/ZLK961543260/article/details/77725521
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞