左倾红黑树(LLRBT)
1.用普通的平衡二叉树(BST)表示2-3-4树
2.用内部的红边表示3-节点和4-节点(红边指入的节点为红节点)
所以我们可以用红黑树来表示2-3-4树。如下:
注意:对应关系不是唯一的(3个节点可以任意倾斜),对于一棵2-3-4树可能有多种不同的红黑树表示,这是因为对于3-node的表示,红色的边可以向左倾,也可以向右倾。
所以要考虑很多情况。但是我们只考虑左倾的情况很大大简化实现。
这种树叫做左倾红黑树。
这样任何一颗2-3-4树都可以得到唯一的左倾红黑树。
以下情况是不允许的:
1.既然是左倾就不能出现右倾3-节点(虽然在标准的红黑树中是允许的,但是这里是左倾红黑树)
2.连续两个红节点(左倾树的原始版本使用此4节点表示形式,但是新版不允许这四种情况出现,如果出现了就要通过旋转调整)
红黑树的查找实现与基本BST相同
BST(和LLRB树)搜索实现:
public Value get(Key key)
{
Node x = root;
while (x != null)
{
int cmp = key.compareTo(x.key);
if (cmp == 0) return x.val;
else if (cmp < 0) x = x.left;
else if (cmp > 0) x = x.right;
}
return null;
}
找一棵树中找最小key
public Key min(){
Node x = root;
if(x == null){
return null;
}
if(x.left == null){
return x.key;
}
return min(x.left);
}
左倾红黑树的插入
插入的难点:不仅要插入还要维持红黑颜色。
接下来要介绍以下旋转操作
左旋:
private Node rotateLeft(Node h) {
// assert (h != null) && isRed(h.right);
Node x = h.right;
h.right = x.left;
x.left = h;
x.color = x.left.color;
x.left.color = RED;
x.size = h.size;
h.size = size(h.left) + size(h.right) + 1;
return x;
}
右旋:
private Node rotateRight(Node h) {
// assert (h != null) && isRed(h.left);
Node x = h.left;
h.left = x.right;
x.right = h;
x.color = x.right.