红黑树与2-3树的等价性
所有的红色节点都是左倾斜的
我的理解是红色是融合的
红黑树与2-3树是等价下,我们看图片 比较一下
红色节点是不是融合和在左边
算法导论中的红黑树的理解
红黑树是保持"黑平衡"的二叉树
严格意义上,不是平衡二叉树 最大高度2logn O(logn)
红合数
2-3树
满足二分树的基本性质
节点可以存放一个元素或者两个元素
左边a是和二叉树一样的结构 左节点存放小于a的值,右边存放大于a的值
右边的b、c是两个元素 左边存放小于b、c的值、中间存放b、c之间的值、右边存放大于b、c的值
2-3树如何维持绝对的平衡
永远不回去空节点,只会去融合
添加节点的两种情况
父节点为2-节点
零时的四节点,然后往下拆分为二分树,然后在向上融合
最后就是往上融合
父亲节点为3-节点
红黑树添加元素
添加66,红颜色代表融合元素
他们不是融合元素,变为黑色,但是还要往跟节点融合,所以42要变为红色
这种条件不需要选择,直接颜色旋转就行
//颜色翻转
private void flipColor(Node node){
node.color=RED;
node.left.color=BLACK;
node.right.color=BLACK;
}
另一种情况,需要选择
因为需要平衡,所以右旋转
然后颜色进行翻转
// node x
// / \ 右旋转 / \
// x T2 ---------> Y node
// / \ / \
// y T1 T1 T3
public Node rightRotate(Node node){
Node x=node.left;
//右旋转
node.left=x.right;
x.right=node;
x.color=node.color;
node.color=RED;
return x;
}
// node x
// / \ 左旋转 / \
// T1 x ---------> node T3
// / \ / \
// T2 T3 T1 T2
private Node leftRotate(Node node){
Node x = node.right;
// 左旋转
node.right = x.left;
x.left = node;
x.color = node.color;
node.color = RED;
return x;
}
//颜色翻转
private void flipColor(Node node){
node.color=RED;
node.left.color=BLACK;
node.right.color=BLACK;
}
// node x
// / \ 右旋转 / \
// x T2 ---------> Y node
// / \ / \
// y T1 T1 T3
public Node rightRotate(Node node){
Node x=node.left;
//右旋转
node.left=x.right;
x.right=node;
x.color=node.color;
node.color=RED;
return x;
}