二叉树、平衡二叉树、红黑树、B/B+树总结及相关面试题

一、二叉树

二叉树是每个结点最多有两个子树的有序树,子树的根被称作左子树和右子树。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。叶节点,分支节点,根节点这些基本概念就不一一进行说明了。
在这里插入图片描述
二叉树性质:

  • 二叉树的第 i 层上至多有 2i-1 个结点。
  • 深度为 k 的二叉树至多有 2k-1 个结点。
  • 对于任何一棵二叉树,若2度的结点数有 n2 个,则叶子数 n0 必定为
    n2+1 即:n0=n2+1

二叉树分类:

1、完全二叉树

若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
在这里插入图片描述

性质:

  • 具有n个结点的完全二叉树的深度为int(log2n)+1
  • 前k-1层结点均是“满的”
  • 第k层可能不满,且结点靠左集中
  • 叶子只可能出现在最后两层,对任意结点,若其右分支下的子孙最大层次为L,则其左分支下的子孙的最大层次必为L 或 L+1,即度为1的点只有1个或0个
  • 只有最后一个叶子的双亲可能度为1,且有左孩子无右孩子,其余非叶子结点度均为2
2、满二叉树

除了叶结点外每一个结点都有左右子叶且叶结点都处在最底层的二叉树。
在这里插入图片描述
性质:

  • 满二叉树的任意节点,要么度为0,要么度为2
  • 每层都“充满”了结点,即每一层 i 的结点数都具有最大值 2i -1

满二叉树和完全二叉树的区别:
满二叉树是结点一个也不少的树,而完全二叉树前 k-1层是满的,但最底层允许在右边缺少连续若干个结点。

二、平衡二叉树(AVL)

它或者是一颗空树,或者具有以下性质的二叉排序树:

  • 左子树和右子树的深度之差(平衡因子)的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树
    在这里插入图片描述

主要使用场景:windows对进程地址空间的管理

平衡二叉树的平衡调整共有四种情况:分别为LL、LR、RR、RL,关于这四种情况的具体调整过程可以看这篇博客:
平衡二叉树(AVL)图解与实现

三、红黑树

红黑树是每个节点都带有颜色属性的自平衡二叉查找树,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。
在这里插入图片描述

在二叉查找树强制一般要求以外,对于任何有效的红黑树增加了如下的额外要求:

  • 节点是红色或黑色。
  • 根节点是黑色。
  • 每个叶节点(NIL节点,空节点)是黑色的。
  • 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
  • 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

红黑树是通过旋转和变色达到自平衡,具体过程可以看下面这篇博客:

30张图带你彻底理解红黑树

使用场景:map、set、Linux文件管理

四、B/B+树
1、B树

B树属于多叉树又名平衡多路查找树,通常我们说m阶的B树,它必须满足如下条件:

  • 每个节点最多只有 m 个子节点。
  • 每个非叶子节点(除了根)具有至少 m/2 子节点。
  • 如果根不是叶节点,则根至少有两个子节点。
  • 具有k个子节点的非叶节点包含 k -1 个键。
  • 所有叶子都出现在同一水平,没有任何信息(高度一致)

B树中一个节点的子节点数目的最大值,用m表示,假如最大值为10,则为10阶。例子如下:
在这里插入图片描述
所有节点中,节点【13,16,19】拥有的子节点数目最多,四个子节点(灰色节点),所以可以定义上面的图片为4阶B树。

排序方式:在B树中,所有节点关键字是按递增次序排列,并遵循左小右大原则,并且当该结点的孩子是非叶子结点时,该k-1个关键字正好是k个孩子包含的关键字的值域的分划。

关于B树的查询、插入、删除流程可见这篇文章:B树和B+树

2、B+树

B+树是应文件系统所需而出的一种B树的变型树。B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。
在这里插入图片描述

特征:

  • 有m个子树的中间节点包含有m个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引;
  • 所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接;
  • 所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。

特点

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

使用场景:磁盘文件组织数据索引和数据库索引

五、相关面试题
1、为什么说B+树比B树更适合数据库索引?

(1)B+树的磁盘读写代价更低
B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了;

(2)B+树查询效率更加稳定
由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当;

(3)B+树便于范围查询
B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。

B树的范围查找用的是中序遍历,而B+树用的是在链表上遍历;

2、B树的缺点

不利于范围查找(区间查找),如果要找 0~100的索引值,那么B树需要多次从根结点开始逐个查找

3、B树与B+树的区别:
  • B+树内部有两种结点,一种是索引结点,一种是叶子结点;B树没有索引结点。
  • B+树的索引结点并不会保存记录,只用于索引,所有的数据都保存在B+树的叶子结点中;而B树则是所有结点都会保存数据。
  • B+树由于叶子结点都有链表,且链表是以从小到大的顺序排好序的,因此可以直接通过遍历链表实现范围查找,而B树不支持范围查找。
  • B树的所有索引值是不会重复的,而B+树非叶子结点的索引值最终一定会全部出现在叶子结点中。
4、平衡二叉树优缺点、与红黑树的区别

二叉查找树在某些情况下可以退化为一条链表,这样的二叉查找树的查找时间复杂度变成了 O(n),为了解决这个问题,于是引申出了平衡二叉树。

优点: 在插入或者删除元素时不需要移动元素,插入和删除的性能较好;

缺点: 平衡树要求每个节点的左子树和右子树的高度差至多等于1,这个要求导致每次进行插入/删除节点的时候,几乎都会破坏平衡树的第二个规则,进而需要通过左旋和右旋来进行调整,使之再次成为一颗符合要求的平衡树。显然,如果在插入、删除很频繁的场景中,平衡树需要频繁着进行调整,会使平衡树的性能大打折扣。

与红黑树的区别:

  • AVL树是高度平衡的,频繁的插入和删除,会引起频繁的rebalance,导致效率下降;红黑树不是高度平衡的,插入最多两次旋转,删除最多三次旋转;
  • 平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。

参考文章:【数据结构】二叉树

猜你喜欢

转载自blog.csdn.net/qq_42908549/article/details/114406567