树型结构总结:二叉查找树、堆、平衡树、2-3查找树、红黑树、B树、B+树

目录

一、二叉查找树

特点:

插入方法:

查询方法:

删除方法:

二叉树的基础遍历:

二、堆

特点:

插入方法: 

删除最大元素:

堆排序:

三、平衡二叉树

特点:

四、2-3查找树和红黑树

2-3查找树特点:

2-3查找树插入方法:

红黑树特点:

【面试题】TreeMap、TreeSet、HashMap底层实现中为什么使用红黑树?为什么不用二叉查找树?为什么不使用平衡树?

五、B树(B-树)

M叉B树特点:

【面试题】文件系统为什么要用B树而不用二叉查找树或者哈希表? 

六、B+树

特点:

【面试题】为什么B+树在数据库用的多(Mysql底层是B+树),不用B树或者哈希表?


二叉树整合了数组和链表的优缺点,使得插入、删除、查找的速度都很快,效率高。树有很多类型,二叉树就是度不超过 2 的树

一、二叉查找树

特点:

左结点的key都小于右结点的key

插入方法:

1)树为空:新结点作为根结点

2)树不为空:从根结点开始找

        2.1 新结点小于当前结点key,则继续找当前结点的左结点

        2.2 新结点大于当前结点key,则继续找当前结点的右结点

        2.3 新结点等于当前结点key,则替换当前结点的val。

查询方法:

从根结点开始:

1)查询结点小于当前结点key,则继续找当前结点的左结点

2)查询结点大于当前结点key,则继续找当前结点的右结点

3)查询结点等于当前结点key,则返回当前结点的val。

删除方法:

1)找到要删除的结点;

2)将要删除结点的右子树的最小结点替换当前要删除的结点。

二叉树的基础遍历:

1)前序遍历:先访问根结点,再访问左子树,最后访问右子树;

2)中序遍历:先访问左子树,再访问根结点,最后访问右子树;

3)后序遍历:先访问左子树,再访问右子树,最后访问根结点;

前、中、后其实就是指的访问根结点的时间。【中序遍历】用的最多,该方法遍历【结果有序】

4)层序遍历:从根结点开始,从上往下按层遍历。

前序遍历结果:EBADCGFH

中序遍历结果:ABCDEFGH

后序遍历结果:ACDBFHGE

层序遍历结果:EBGADFHC

二、堆

堆是一个完全二叉树,除了树的最后一层结点不需要是满的,其他每一层从左往右都是满的,如果最后一层结点不是满的,那么要求左满右不满。

特点:

每个结点都大于等于它的两个子结点,且两个子结点顺序没有规定。

注意与二叉查找树的区别!!!堆其实就是一个【最大优先队列】

插入方法: 

1)将元素从最后一层插入,保证依旧是完全二叉树即可;

2)将插入原始从最后一层,不断上浮,直到满足每个结点都大于等于它的两个子结点。

(二叉查找树的插入是从根结点往下沉)


由于堆的结构特性,查询和删除任意值的效率低,一般用于查询或删除最大/最小值,是最大优先队列最小优先队列的底层实现结构。


删除最大元素:

1)根结点即最大元素,删除根结点

2)将最后一个元素(最下面一层的最右边的元素)作为新的根结点;

3)将新的根结点不断下沉,直到满足每个结点都大于等于它的两个子结点。

堆排序:

堆排序就是不断取出(删除)最大元素的过程,取最大值,重新排列,再取最大值,再重新排列......

三、平衡二叉树

平衡二叉树,又被称为AVL树,是为了解决二叉树退化成一棵链表而诞生的。

特点:

1)拥有二叉查找树的全部特性;

2)每个节点的左子树和右子树的高度差至多等于1,左右子树的高度差是通过左旋右旋实现的。

平衡二叉树过于追求【完全平衡】高度差为1的要求太过严格,尤其是对于频繁删除、插入的场景效率低

四、2-3查找树和红黑树

2-3查找树特点:

为了保证树的平衡性,同时又保留一些灵活性,引入3-结点,允许一个3-结点保存2个键。

2-结点:同普通的二叉查找树,一个结点有一个键,对应2条链,左链均小于当前键,右链均大于当前键;

3-结点:一个结点有两个键,对应3条链,左键大于右键,左链均小于左键,右链均大于右键,中链位于左右键之间。

2-3查找树插入方法:

1)自顶向下查找到合适位置;

2)如果插入位置为2-结点,则直接将2-结点变为3-结点;

3)如果插入位置为3-结点,则将3-结点变为临时的4-结点(3个键),将中间键上提到父结点,如果父结点为2-结点,则直接变成3-结点;如果父结点为3-结点,则继续上提,直到根结点,若上提到根结点,根结点变为4-结点,则继续上提,树高+1;

注意:

1)4-结点变为3-结点,树高不会增加,只有当根结点为4-结点,分解根结点时,树高+1

2)与普通二叉查找树相比,普通二叉查找树为自顶向下生长,2-3树为自底向上生长

红黑树特点:

红黑树是对2-3树的编码:红链接:将两个2-结点连起来作为3-结点;黑链接:普通链接。

1)红链接均为左链接;

2)没有任何一个结点同时和两个红链接相连(否则就是4-结点了);

3)该树是完美平衡的,最下面的任意空结点到根结点的黑链接数量是相等的。

红黑树经过插入、删除等操作后,可能会出现一个结点同时和两个红链接相连,或者红链接出现在右链接的情况,此时需要通过:左旋、右旋、颜色翻转等操作来保证树的平衡。此处不展开分析。

【面试题】TreeMap、TreeSet、HashMap底层实现中为什么使用红黑树?为什么不用二叉查找树?为什么不使用平衡树?

1)二叉查找树在添加元素的时候极端情况下会出现线性结构,此时效率降低;

2)平衡二叉树追求绝对严格的平衡关系,在频繁的插入、删除等操作的情景下,效率低;

3)红黑树是一个“适度平衡”的二叉搜索树,而非如平衡二叉树一般“严格”的平衡;

红黑树与平衡二叉树(AVL)对比:

  • AVL更平衡,结构上更加直观,时间效能针对读取而言更高;维护稍慢,空间开销较大。
  • 红黑树,读取略逊于AVL,维护强于AVL,空间开销与AVL类似,内容极多时略优于AVL,维护优于AVL。

红黑树中最长支路的长度必然“不大于”最短者的2倍,设Max者为H,Min者为h,则有:H<=2h。从搜索的角度考虑,其复杂度为O(n)的,最长支路与最短支路搜索时间复杂度为O(H)<=O(2h),H和h无穷大时,最长支路和最短支路的搜索时间复杂度相等,从这个角度讲红黑树也算是“平衡”的。

红黑树有着良好的稳定性和完整的功能,性能表现也很不错,综合实力强,因此TreeMap、TreeSet、HashMap底层实现中会选择使用红黑树。

五、B树(B-树)

M叉B树特点:

1)每个结点最多有M-1个key,并以升序排列;

2)每个结点最多能有M个子结点;

3)根结点至少有两个子结点。

【面试题】文件系统为什么要用B树而不用二叉查找树或者哈希表? 

如果是查找效率(即比较次数)的话,实际上二叉树可以说是最快的了,但是,我们的文件索引是存放在磁盘上的,所以我们不仅要考虑查找效率,还要考虑磁盘的寻址加载次数,而这也是我们为什么要用 B 树的原因。

在把磁盘里的数据加载到内存中的时候,是以页为单位来加载的,而我们也知道,节点与节点之间的数据是不连续的,所以不同的节点,很有可能分布在不同的磁盘页中。所以对于上面的二叉查找树,我们可能需要进行 4 次寻址加载,而对于 B 树,由于 B 树的每一个节点,可以存放多个元素,所以磁盘寻址加载的次数会比较少

哈希表虽然能够再 O(1) 查找到目标数据,但如果要进行模糊查找的话,却只能遍历所有数据,并且如果出现了极端情况,哈希表冲突的元素太多,也会导致线性时间的查找效率的。

二叉搜索树、平衡二叉树、红黑树、B树、B+树面试题_樊庆威的博客-CSDN博客https://blog.csdn.net/qq_41765712/article/details/104228938?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~TopBlog-1.topblog&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~TopBlog-1.topblog&utm_relevant_index=2

六、B+树

特点:

1)同B树,一个结点可以有多个key;

2)非叶子结点只有索引作用,即只存key,不保存val

2)所有叶结点保存val,并且构成一个有序链表,可以按照key排序依次遍历全部数据。


由于B+树非叶子结点不包含数据,因此在内存相同的情况下,能存储更多的key,且链表结构有利于区间查找。


【面试题】为什么B+树在数据库用的多(Mysql底层是B+树),不用B树或者哈希表?

数据库中select数据,不一定只选一条,B树的话需要做局部的中序遍历,可能跨层访问,而B+树由于所有数据都在叶子节点,并且链表链接,只要找到首尾,就能找出所有数据。且在数据量大的情况可能无法一次装入内存,B+树的设计可以允许数据分批

  1. 相对于二叉树,层级更少,搜索效率高;
  2. 对于B树,无论是叶子节点还是非叶子节点,都会存储数据,而每一个节点都用一页保存,一页大小为16K,每页中都存储K-V,会导致存储的Key减少,同样保存大量数据时,只能增加树的高度,导致性能降低;
  3. 相对于Hash索引,B+树支持范围匹配及排序操作,Hash索引存在Hash碰撞,降低效率,且只允许精准查找。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyc头发还挺多的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值