二叉树、自平衡二叉查找树、B树梳理

几种常用的树
在这里插入图片描述

1 二叉树

英文名称(Binary Tree)

1.1 满二叉树

一棵深度为k,且有2k-1个结点的二叉树,称为满二叉树。

1.2 完全二叉树

除最后一层外,若其余层都是满的,并且最后一层最少又一个叶子节点,节点数为2k-1到2k-1。

1.3 平衡二叉树

左右树高度差不超过1,左右子树也是平衡二叉树。

2 二叉查找树

也称为二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。

2.1 特性

		(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
		(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
		(3)左、右子树也分别为二叉排序树;
		(4)没有键值相等的结点。

2.2 描述

元素经过升序后组成的树状数据结构,便于高效的查找、新增、删除元素。

3 红黑树

红黑树(Red Black Tree) 即为平衡二叉树的一种,也是一种二叉查找树。

3.1 特性:

       1)节点是红色或黑色;
       2)根节点一定是黑色;
       3)每个叶节点都是黑色的空节点(NIL节点);
       4)每个红节点的两个子节点都是黑色的(从每个叶子到跟的所有路径上不能有两个连续的红节点)(即对于层来说除了NIL节点,红黑节点是交替的,第一层是黑节点那么其下一层肯定都是红节点,反之一样)
       5)从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点

3.2 自平衡-左旋、右旋

左右子树,层高度差超过1,需要进行自平衡。
左旋:
当右子树过深,树向左移,形象描述,树看作是一根绳子,手提起 新的根 节点,然后变色即可。替换根节点后,调整节点位置(与之前的左子节点位置的变化、与老的根节点的位置变化),以达到自平衡,其他节点相对位置不变。
右旋:
同理。

参考:https://zhuanlan.zhihu.com/p/79980618?utm_source=cn.wiz.note

3.3 换色

以插入为例:

  1. 当出现新的节点时默认为红色插入,如果其父节点为红色,则对其递归向上换色,如果根节点由此变为红色,则对根节点进行左旋(右侧过深)或右旋(左侧过深),之后从根节点向下修改颜色 。
  2. 从根节点检查红色节点是否符合路径上的黑色节点数量一致,如果不一致,对该节点进行左旋(右侧黑色节点数量更多)或右旋(左侧黑色节点数量更多),并变换颜色,重复2操作直到符合红黑树规则。
    参考:https://blog.csdn.net/q3244676719/article/details/81540830

3.4 插入、删除

这两个操作包含都是由三步骤组成:查询、自平衡、换色。

4 B树

一种适用于外查找的树,它是一种平衡的多叉树,称为B树(或B-树、B_树)。
一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。

4.1 特性

(1)排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则;
(2)子节点数:非叶节点的子节点数>1,且<=M ,且M>=2,空树除外(注:M阶代表一个树节点最多有多少个查找路径,M=M路,当M=2则是2叉树,M=3则是3叉);
(3)关键字数:枝节点的关键字数量大于等于ceil(m/2)-1个且小于等于M-1个(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2);
(4)所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子;

在这里插入图片描述

4 B+树

B+树是B树的一个升级版,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。B+树查找的效率要比B树更高、更稳定。
B+树是一种树数据结构,通常用于数据库和操作系统的文件系统中。B+树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+树元素自底向上插入,这与二叉树恰好相反。
在这里插入图片描述

4.1 特性

(1)B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加;
(2)B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样;
(3)B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针。
(4)非叶子节点的子节点数=关键字数(来源百度百科)(根据各种资料 这里有两种算法的实现方式,另一种为非叶节点的关键字数=子节点数-1(来源维基百科),虽然他们数据排列结构不一样,但其原理还是一样的Mysql 的B+树是用第一种方式实现);

4.2 比较

1、B+树的层级更少:相较于B树B+每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快;
2、B+树查询速度更稳定:B+所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定;
3、B+树天然具备排序功能:B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。
4、B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。

1、B树相对于B+树的优点是,如果经常访问的数据离根节点很近,而B树的非叶子节点本身存有关键字其数据的地址,所以这种数据检索的时候会要比B+树快。

5 B*树

B*树是B+树的变种,相对于B+树他们的不同之处如下:

(1)首先是关键字个数限制问题,B+树初始化的关键字初始化个数是cei(m/2),B*树的初始化个数为(cei(2/3*m))
(2)B+树节点满时就会分裂,而B*树节点满时会检查兄弟节点是否满(因为每个节点都有指向兄弟的指针),如果兄弟节点未满则向兄弟节点转移关键字,如果兄弟节点已满,则从当前节点和兄弟节点各拿出1/3的数据创建一个新的节点出来;
(3)在B+树的基础上因其初始化的容量变大,使得节点空间使用率更高,而又存有兄弟节点的指针,可以向兄弟节点转移关键字的特性使得B*树额分解次数变得更少.

参考:https://zhuanlan.zhihu.com/p/27700617

6 英文名称区别

中文名称				英文名称									别名
二叉树				Binary Tree						
二叉排序树			Binary Sort Tree						二叉搜索树
二叉查找树			Binary Search Tree						二叉搜索树
红黑树				RED-BLACK-TREE							对称二叉B树
B树 				B tree									B-树、B_树
B+树				B+ Tree						
B*树				B+ Tree						

猜你喜欢

转载自blog.csdn.net/leinminna/article/details/106135246