既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
2-3-4 树
含义如下:
2 节点 包含两个子节点和一个数据元素。
3 节点 包含三个子节点和一个数据元素。
4 节点 包含四个子节点和一个数据元素。
2-3-4 树,它的每个非叶子节点,要么是 2 节点,要么是 3 节点,要么是 4 节点,且可以自平衡,所以称作 2-3-4 树。
规则如下:
规则 1 加入新节点时,不会往空的位置添加节点,而是添加到最后一个叶子节点上。
规则 2 四节点可以被分解三个 2-节点组成的树,并且分解后新树的根节点需要向上和父节点融合。
插入操作
原本的 2-3-4 树,如下图:
对于上图的 2-3-4 树,插入一个节点 17,由于规则 1,节点 17 不会加入节点 [16,18,20] 的子树,而是与该节点融合。
由于规则 2,节点 [16,17,18,20] 是一个 4 节点,将该节点进行拆解成新的树,将 18 作为子树的根节点进行拆分。
此时树暂时失去了平衡,我们需要将拆分后的子树的根节点向上进行融合。
同理可得,由于规则 2,节点 [6,10,14,18] 是一个 4 节点,将该节点进行拆解成新的树,将 14 作为子树的根节点进行拆分,完成了 2-3-4 树的构建。
总结了下插入节点的过程,无非也就为了符合两条规则,那么,2-3 树,2-3-4 树都有了,那是不是也有 2-3-4-5 树,2-3-4-5–…-n 树的存在呢?
事实上是有的,世人把这一类树称为一个名字:B 树。
B 树
B 树,表示的是一类树,它允许一个节点可以有多于两个子节点,同时,也是自平衡的,叶子节点的高度都是相同的。
所以,为了更好地区分一颗 B 树到底属于哪一类树,我们给它一个新的属性:度(Degree):一个节点能有多少箭头指向其他节点。
具有度为 3 的 B 树,表示一个节点最多有三个子节点,也就是 2-3 树的定义。具有度为 4 的 B 树,表示一个节点最多有四个子节点,也就是 2-3-4 树的定义。
图为 4 的 B 树的示例图:
红黑树
R-B Tree,全称是 Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。
红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
如何理解红黑树
一个经典的红黑树,如下图所示(省略了叶子节点都是黑色的 NIL 节点):
如第二张图所示,将该红黑树与上文讲到的 2-3-4 树对比,是否发现,红黑树就是一个 2-3-4 树:
- 每个节点或者是黑色,或者是红色。
- 根节点是黑色。
- 每个叶子节点(NIL)是黑色。注意:这里叶子节点,是指为空(NIL 或NULL)的叶子节点!
- 如果一个节点是红色的,则它的子节点必须是黑色的。由于红黑树的每个节点都是由 2-3-4 树转化而来的,从而红色节点不能连续两个出现,不然会出现 4 节点的情况,导致违反了规则 2。
而且红黑树的每一个黑节点都是 3 节点中的最中间的那个值,或者是 2 节点 中其中一个值。
从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
**原因:**红黑树这些黑色节点在 2-3-4 树中代表的是由 1 节点的一个 2-3-4 树,而 2-3-4 树是同一个子树的深度是相同的,平衡的,所以从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
如下图所示,蓝色代表是黑色节点:
注意如下几点:
- 特性(3)中的叶子节点,是只为空(NIL 或 null)的节点。
- 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相 对是接近平衡的二叉树。
- 红黑树虽然本质上是一棵二叉查找树,但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为 O(log n)。
由上面的例子所示,我们只要把红黑树当做是 2-3-4 树来处理,并且对应的颜色进行改变或者进行左旋右旋的操作,即可达到使得红黑树平衡的目标。
如何保持红黑树的结构
当我们插入一个新的节点的时候,如何保证红黑树的结构依然能够符合上面的五个特性呢?
树的旋转分为左旋和右旋,下面借助图来介绍一下左旋和右旋这两种操作。
①左旋
原本的状态:
过程图:
结束图:
如上图所示,当在某个目标结点 E 上,做左旋操作时,我们假设它的右孩子 S 不是 NIL。
左旋以 S 到 E 之间的链为“支轴”进行,它使 S 成为该子树的新根,而 S 的左孩子则成为 E 的右孩子。
②右旋
原先状态图:
过程图:
结束图:
同左旋类似,当在某个目标结点 S 上,做右旋操作时,我们假设它的右孩子 S 不是 NIL。
左旋以 S 到 E 之间的链为“支轴”进行,它使 S 成为该子树的新根,而 S 的左孩子则成为 E 的右孩子。
应用
红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是 O(logn),效率非常之高。
例如,Java 集合中的 TreeSet 和 TreeMap,C++ STL 中的 set、map,以及 Linux 虚拟内存的管理,都是通过红黑树去实现的。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新