【数据结构】浅谈BST、AVL树、红黑树、B树、B+树

面试中,各种数据结构中对于"树"的考查十分普遍,刚开始复习,往往被各种树弄的一头雾水。本文主要对BST、AVL树、红黑树、B树、B+树作剖析。


一、概述

BST:二叉搜索树
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点(因此,插入的时候一定是叶子节点)。
在这里插入图片描述

AVL树:自平衡二叉查找树
(1)本身首先是一棵二叉搜索树;
(2)带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1;
在这里插入图片描述
红黑树
(1)本身首先不一定是一棵AVL树,它是带有平衡条件的二叉查找树;
(2)平衡因子允许大于1;

具体而言:

  • 每个节点或者是黑色,或者是红色。
  • 根节点是黑色。
  • 每个叶子节点是黑色。 [注意:这里叶子节点,是指为空的叶子节点!]
  • 如果一个节点是红色的,则它的子节点必须是黑色的。
  • 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
    在这里插入图片描述

B树(B-tree)
一棵m阶B树是一棵平衡的m路搜索树,具有如下几个特征:
(1)根结点至少有两个子女。
(2)每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
(3)每一个叶子节点都v包含k-1个元素,其中 m/2 <= k <= m
(4)所有的叶子结点都位于同一层。
(5)每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。
在这里插入图片描述
B+树
B+树是B树的一种变形形式。一个m阶的B+树具有如下几个特征:
(1)有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
(2)所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
(3)所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。在这里插入图片描述


二、常见面试问题:

1. 数据库索引有哪些,优缺点?

hash索引和B+树索引
hash索引等值查询效率高,但是不能排序,因此不能进行范围查询
B+树索引数据有序,能够进行范围查询

2.为什么不用二叉查找树作为数据库索引?

二叉查找树,查找到指定数据,效率其实很高logn。但是数据库索引文件有可能很大,关系型数据存储了上亿条数据,索引文件大则上G,不可能全部放入内存中,
而是需要的时候换入内存,方式是磁盘页。一般来说树的一个节点就是一个磁盘页。如果使用二叉查找树,那么每个节点存储一个元素,查找到指定元素,需要进行大量的磁盘IO,效率很低。
而B树解决了这个问题,通过单一节点包含多个data,大大降低了树的高度,大大减少了磁盘IO次数。

3.B树和二叉查找树的性能对比?

B树包括B+树的设计思想都是尽可能的降低树的高度,以此降低磁盘IO的次数,因为一个索引节点就表示一个磁盘页,页的换入换出次数越多,表示磁盘IO次数越多,越低效。
B树算法减少定位数据所在的节点时所经历的磁盘IO次数,从而加快存取速度。
假设一个节点可以容纳100个值,那么3层的B树可以容纳100万个数据。(根节点100值,第二层可以存储99个节点(k-1),也就是99100 个值,第三层可以存储
(99
100-1)*100)结果是近似100万个数据。而如果使用二叉查找树,则需要将近20层,也就是进行20次磁盘IO,性能差距如此之大。
如mongoDB数据库使用,单次查询平均快于Mysql(但侧面来看Mysql至少平均查询耗时差不多)。

4.B+对比B树的优点?

因为B树的每个节点除了存储指向子节点的索引之外,还有data域,因此单一节点存储的指向子节点的索引并不是很多,树高度较高,磁盘IO次数较多,
而B+树单一节点存储的指向子节点的索引更多,B+树空间利用率高,因此B+树高度更低,磁盘IO次数更少,性能更好。
因为B树的中间节点存储了数据,所以整个树的每一层都有可能查找到要查找的数据,查询性能不稳定,
而B+树所有的data都存储在叶子节点,且叶子节点位于同一层,因此查询性能稳定。
B树如果想要进行范围查找,需要频繁的进行二叉树的中序遍历,进行范围查找比较复杂,
B+树要查找的元素都位于叶子节点,且连接形成有序链表,便于范围查找。

4.B树,B+树使用场景。

B树主要用于文件系统,和部分数据库索引,如文档型数据库mongodb
B+树主要用于mysql数据库索引。

5.为什么数据库索引不用红黑树而用B+树?

红黑树当插入删除元素的时候会进行频繁的变色与旋转(左旋,右旋),来保证红黑树的性质,浪费时间。
但是当数据量较小,数据完全可以放入内存中,不需要进行磁盘IO,这时候,红黑树时间复杂度比B+树低。
比如TreeSet TreeMap 和HashMap (jdk1.8)就是使用红黑树作为底层数据结构。


三、易错点:

1. B树与B-树

B-树就是B树,’-'只是连接符,英文一看就懂了:B tree / B-tree

2. B树、B+树与BST

B树、B+树不是BST,可以简单的理解,BST是二叉树,B树则是m叉树

3. B树、B+树与AVL树

同上,一个是二叉树,一个是m叉树。
此外,AVL插入新数据时,使用“旋转”调整;B树则是使用“分裂法”。
详情参见:
B树和B+树的插入、删除图文详解

参考文献
b+树图文详解
B树和B+树的插入、删除图文详解
B树,B+树,红黑树 数据库常见面试题
红黑树和B树的区别–2019年面试题目

原创文章 36 获赞 32 访问量 2754

猜你喜欢

转载自blog.csdn.net/weixin_43868754/article/details/105118642