2-3树
定义:每个节点有两个或三个节点
分类:
- 2-节点:一个节点有1个元素,且有两个孩子
- 3-节点:一个节点有2个元素,且有三个孩子
基本性质
- 满足二分搜索树的基本性质
- 一个节点可以存放一个或两个元素
- 2-3树是一颗绝对平衡的树(左右子树的高度相等)
2-3树元素的添加
-
添加元素的规则
- 新添加的元素不会添加到空节点上,而是添加到最后搜索到的叶子结点,再与之融合在一起
- 如果新加入的元素与2-节点融合,直接融合,形成3-节点
- 如果新加入的元素与3-节点融合,先融合形成4-节点,再进行拆分成每个节点有两个孩子的三个节点。
- 不能超过3-节点,即一个节点不能有超过三个孩子
-
添加的元素依次为 42,37,12,18,6,11,5
-
总结:
- 12为根节点不需要再向上与父节点融合,本次的添加操作结束
- 每一步的操作都体现了2-3树的绝对平衡性
- 一般流程:插入-融合-拆分
红黑树与2-3树的等价性
红黑树的基本性质
- 每个节点要么是红色要么是黑色
- 根节点是黑色
- 每一个叶子节点(最后的空节点)是黑色的
- 如果一个节点为红色,其孩子为黑色
- 从任意一个节点到叶子节点,经过的黑色节点的数量是一样的
- 红黑树的红色节点对应就是2-3树中3-节点的左结点
- 红黑树是“黑平衡”的二叉树,左右子树的黑色节点的高度差保持绝对的平衡。但不是平衡二叉树。最大高度h=2*log^n
- 经过log^n级别的黑色节点,而经过的每一个黑色节点的左孩子为红色节点,即经过的黑色节点都是2-3树中的3-节点的右节点
红黑树的性能
- 失去了平衡性,但统计性能更优,添加节点(O(log^n))
删除节点(O(log^n)),比AVL树拥有更好的性能,红黑树是保持自平衡的树结构。
红黑树添加新元素
- 情况一:将新元素添加到2-节点中,添加的新元素在父节点的右侧,需要对父节点进行左旋转,本质上等价于2-3树中将新元素放进2-节点形成3-节点对应在红黑树中的操作——左旋转:
//左旋转代码实现 private Node leftRotate(Node node){ Node x=node.right; node.right=x.lenft;; x.left=node; //颜色改变 x.color = node.color; node.color = red; return x; //返回根节点
}
- 情况二:向2-3树中的3-节点添加新元素对应在红黑树中黑色节点(有一个红色的左结点)的右侧添加新元素,即添加的元素比3-节点中两个元素都要大——颜色翻转。
//颜色翻转
private void flipColor(Node node){
node.color = red;
node.left.color = black;
node.right.color = black;
}
- 情况三:将新元素加入到2-3树中的3-节点中,将新元素添加到黑色节点左孩子的左孩子上,即添加的元素比3-节点中两个元素都要小——右旋转。
//右旋转
private void rightRotate(Node node){
Node x=node.left;
node.left=x.right;
x.right=node;
//颜色维护
x.color=node.color;
node.color=red;
return x;
}
- 情况四:将新元素添加到黑色节点的左孩子的右孩子上,即a(左孩子)<b(新元素)<c(父节点)
- 总结:将新元素加入到红黑树对应2-3树中的3-节点。