文章目录
2-3-4树
2-3-4 树把数据存储在叫做元素的单独单元中。它们组合成节点,每个节点都是下列之一
2-节点,就是说,它包含 1 个元素和 2 个儿子,
3-节点,就是说,它包含 2 个元素和 3 个儿子,
4-节点,就是说,它包含 3 个元素和 4 个儿子 。
每个儿子都是(可能为空)一个子 2-3-4 树。根节点是其中没有父亲的那个节点;它在遍历树的时候充当起点,因为从它可以到达所有的其他节点。叶子节点是有至少一个空儿子的节点。
同B树一样,2-3-4 树是有序的:每个元素必须大于或等于它左边的和它的左子树中的任何其他元素。每个儿子因此成为了由它的左和右元素界定的一个区间。
2-3-4 树是红黑树的一种等同,这意味着它们是等价的数据结构。换句话说,对于每个 2-3-4 树,都存在着至少一个数据元素是相同次序的红黑树。在 2-3-4 树上的插入和删除操作也等价于在红黑树中的颜色翻转和旋转。这使得它成为理解红黑树背后的逻辑的重要工具。
一个典型的2-3-4树如下:
树的生长过程
依次插入2,3,4,5,6,7,8,9,10,11,1
插入规则,优先合并插入元素,直到合并超过4个元素,就是说元素插入时要和4-节点(含3元素)合并时,会向上裂变,原来4-节点中间的元素会向上生长一层
注意,因为这种从叶子节点向上裂变生长的模式,2-3-4永远是一颗平衡二叉搜索树
(1)插入2
(2)插入3变为3-节点
(3)插入4变为4-节点
(4)插入5之后,4-节点会向上裂变,元素3变为上一层的父节点
(5)插入6之后,比3大,往右子树上靠,合并为新的4-节点
(6)插入7,大于3,往右子树上靠,(4,5,6)4-节点裂变,元素5变为上一层的父节点,然后再与元素3合并为新的3-节点
(7)插入8,比5大,往右子树靠,合并成新的4-节点
(8)插入9,(6,7,8)4-节点裂变,元素7变为上一层的父节点,和(3,5)合并为新的4-节点
(9)插入10,形成新的4-节点
(10)插入11,(8,9,10)4-节点分裂,元素9变为上一层父节点,但是(3,5,7)也是4-节点,所以继续上向裂变,此时中间元素5变为最上层父节点。
(11)插入1,往左子树上找,最终和2合并为3-节点
2-3-4树与红黑树
(1)转变为红黑树规则
2-节点必转为黑色节点
3-节点有两种转换形式,一种左倾,一种右倾,如图,这也意味着一个2-3-4树可以转换为多个状态的红黑树
4-节点中间元素变为父节点并为黑色,剩下两个子节点为红色
如果裂变之后新的父节点为红色,两个字节点为黑色
(2)转变成的红黑树
(3)推导红黑树性质
性质1:根节点必是黑色
参照上面的转变红黑树规则,可以发现2-节点必为黑色节点;而无论是3-节点还是4-节点,转换红黑树后父节点都是黑色节点,所以红黑树根节点必为黑色节点。
性质2:红色节点的两个子节点必为黑色节点
意思就是不可能有两个红色节点,以红色节点7来说,不管下面子节点是2-节点、3-节点还是4-节点,转换红黑树时其父节点都是黑色节点,成为7的子节点,如下图所示:
性质3:所有叶子都是黑色
这个不用推导,默认所有实际叶子节点的两个空子节点为黑色节点。
性质4: 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点(黑色平衡)
如图所示:2-3-4树转为红黑树过程中,每个2-节点、3-节点、4-节点转换时至少产生一个黑色节点且为父节点,所以在下图中每一层都固定有一个黑节点,根节点5无论到10、11、12都抽象等同于到达(10,11,12)这个集合,包含的黑色节点都等于所在层数-任一节点的层数