带你整理面试过程中关于 二叉树二叉搜索树平衡二叉树B 树和 B+树的相关知识

Posted 南淮北安

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带你整理面试过程中关于 二叉树二叉搜索树平衡二叉树B 树和 B+树的相关知识相关的知识,希望对你有一定的参考价值。

文章目录

一、二叉树(Binary Tree)

每个节点最多有两个子节点的

二、二叉搜索树(Binary Search Tree)

二叉查找树又叫二叉搜索树,它或者是一棵空树,或者是具有下列性质的二叉树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树。

三、平衡二叉树(AVL Tree)

AVL树定义:所有节点的左右子树的高度差小于等于1的二叉树。

  • 非叶子节点最多拥有两个子节点;
  • 非叶子节值大于左边子节点、小于右边子节点;
  • 树的左右两边的层级数相差不会大于1;
  • 没有值相等重复的节点;

如下图:
根节点左边高度是3,因为左边最多有3条边;右边高度而2,相差1.
根节点左边的节点50的左边是1条边,高度为1,右边有两条边,高度为2,相差1。

平衡二叉树是基于二分法的策略提高数据的查找速度的二叉树的数据结构

时间复杂度: O ( l o g n ) O(logn) O(logn)

四、B树(B Tree)

B 树和 B- 树是同一种树

B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径不只两个),数据库索引技术里大量使用者B树和B+树的数据结构

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

五、B+树(B+ tree)

B+树是B树的一个升级版,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。

与 B 树不同:

  • B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加;
  • B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样;
  • B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针。
  • 非叶子节点的子节点数=关键字数

插入、删除时间复杂度: O ( 1 ) O(1) O(1)
查找时间复杂度: O ( l o g n ) O(logn) O(logn),和树高有关系,什么时候树最高,那就是只分两个叉,B+树也叫作多路平衡二叉树,多路的意思就是有多个叉,现在只有两个叉,那就和平衡二叉树一样了,所以也就是平衡二叉树的时间复杂度 O ( l o g n ) O(logn) O(logn)

特点:

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

非叶子节点不存储数据,查询稳定,叶子节点靠双向链表连接

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

五、数据库为什么引入 B+ 树

数据库访问数据是通过页,一个页就是一个B+ 树节点,访问一个节点相当于一次 I/O 操作,所以越快找到节点,查找性能越好,而B+树的特点就是层级少,速度快,可以有效减少访问节点次数从而提高性能。

因为B+树的非叶子节点只存储索引,不存储数据,所以同样大小的磁盘页就可以容纳更多节点的数据,所以相同节点数据的情况下,B+树会更加的矮胖,IO的次数也会更小

而二分查找树,相当于二分查找,有很好的查找性能,但是当节点比较多时,树的深度比较大(最坏的情况可能退化为单链表),数据查询的时间主要依赖于磁盘 I/O 的次数,二叉树深度越大,查找的次数越多,性能就越差


【参考】

【1】https://www.cnblogs.com/williamjie/p/11081096.html
【2】https://zhuanlan.zhihu.com/p/27700617

六、树的搜索算法

深度优先遍历:
就是一搜到底,不断的去查找是否有下级节点,如果有就继续递归往下查找,否则回到上级,再由未遍历的下级节点进入

实现方式:利用栈和递归实现

找到一个起点A,然后将 A 相邻的点放入栈中,将栈顶元素 B 取出,并将 B 相邻且没有访问过的点放入栈中,不断的重复,直至栈的清空。这时候,依次访问的顶点就是遍历的顺序

应用场景:快速的发现底部的节点,判断连通性

广度优先遍历:
也叫做层次遍历,从一个节点出发,查找处它所有的子节点,再依次从所有的子节点中向下查找所有子节点

实现方式:利用队列和递归来实现

找到一个起点A,并将A相邻的点放入队列中,这时将队首元素B取出,并将B相邻且没有访问过的点放入队列中,不断的重复这个操作,直至队列清空,这时候访问的顶点就是遍历的顺序

应用场景:寻找最短路径的问题

七、面试题

  1. 普通二叉树和b+树的区别?(阿里)
  2. 给 B+ 树下一个定义?

B+树就是一个n叉树的数据结构,每个节点有多个孩子,非叶子节点作为索引使用,叶子节点存储关键字以及相应记录的地址

以上是关于带你整理面试过程中关于 二叉树二叉搜索树平衡二叉树B 树和 B+树的相关知识的主要内容,如果未能解决你的问题,请参考以下文章

二叉树及特殊二叉树(满二叉树完全二叉树二叉排序树平衡二叉树)的定义和性质(附详细推理过程)

数据结构~基础2~树《二叉树二叉搜索树AVL树B树红黑树》的设计~高度平衡二叉树AVL树

面试---算法面试

普通二叉树二叉查找树平衡二叉树常见操作汇总

数据结构之二叉搜索树AVL自平衡树

3 分钟理解完全二叉树平衡二叉树二叉查找树