三:2-3树
2-3 树作为一种平衡查找树,查询效率比普通的二叉排序树要稳定许多。但是2-3树需要维护两种不同类型的结点,查找和插入操作的实现需要大量的代码,而且它们所产生的额外开销可能会使算法比标准的二叉查找树更慢。
2-3树:满足二分搜索树的基本性质,是一颗绝对平衡的树,节点可以存放一个或两个元素,每个节点有2个或3个孩子。
如下图所示都是2-3树,左边是节点存放了一个元素,右边是节点存放了两个元素,对于右边的图,左子树<b,中间的孩子树则在b、c之间,右孩子则大于c。
下图是一个实例,可以好好体会一下什么是2-3树,这里说一下什么是绝对平衡树,就是根节点到任意节点所经过的节点数量绝对相同,节点的左右孩子高度一定一样,根据这个性值,就可以知道二叉搜索树(可能形成链式结构)、AVL树(左右子树高度不超过1)、堆(最后一层叶子节点可能没有填满)...这些都不是绝对平衡树。
由于2-3树是一颗绝对平衡的树,那么在插入元素时就不能将元素插入到为空的位置(因为要保证绝对平衡),如下图。
此时的根节点root值为42,待插入的元素值为37,需要如何插入元素才能保证插入后仍然是一颗绝对平衡的树呢?这时root节点的孩子节点为空,如果直接插入其孩子节点中那显然就不是一颗绝对平衡的树了。
始终记得,插入元素时不能将元素插入到空位置,那么对于上图而言,要想保证绝对平衡只有将37和42节点融合,如下图.
那么这时如果再来一个元素,如下图这时该怎么插入呢?
其实还是和插入37元素一样,由于不能向空的位置插入,那么也只能融合。但是下图融合后形成了四节点(指的是可拥有孩子数量),这不符合2-3树的定义,对于2-3树,能拥有的孩子节点数只能是2或3,因此还需要进行调整。
调整结果如下图,这样就保证满足了2-3树的性质。
这时再来一个元素,如下图,这时看起来18可以和37融合,也可以和12融合,但是结果是和12融合,因为插入元素时,一直先从根节点开始向下寻找,只有当孩子节点为空时才会和父节点融合,如果孩子节点不为空,则向下融合。
四:2-3-4树
2-3-4树是对2-3树的概念扩展,包括了4节点的使用。一个4节点中包含小中大三个元素和四个孩子(要么有四个孩子要么没有,不存在其他情况),如果某个4节点有孩子的话,左子树包含小于最小元素的元素;第二子树包含大于最小元素,小于第二元素的元素;第三子树包含大于第二元素,小于最大元素的元素;右子树包含大于最大元素的元素。如下图就是一个2-3-4树:
2-3-4树可以在O(log n)时间内查找、插入和删除,这里的 n 是树中元素的数目。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 树上的插入和删除操作也等价于在红黑树中的颜色翻转和旋转。这使得它成为理解红黑树背后的逻辑的重要工具。
————————————————
版权声明:本文为CSDN博主「Xyz_zh」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41963657/article/details/94545043