红黑查找树是2-3树概念的一个实现。把2-3树中的3节点以一个小的二分查找树实现。代表3节点的树左链接被标记为“红”链接。
红黑查找树性质:
没有一个节点有两条红链接(不存在4节点)
从根节点到树底黑节点数量一致
红节点始终在左边
红黑树搜索操作:
搜索操作忽视链接颜色,和普通二叉树搜索代码完全一致。同理,其他查找操作,如ceiling, selection, rank,均和二叉树代码一致
红黑树区别主要在插入操作。要实现插入首先需要实现三个基础操作:左旋,右旋和变色
左旋:如果红链接在右侧,要将其挪回到左侧
左旋示例代码:
private Node rotateLeft(Node h) {
Node x = h.right;
h.right = x.left;
x.left = h;
x.color = h.color;
h.color = RED;
x.count = h.count;
h.count = 1 + size(h.left) + size(h.right)
return x;
}
相反的,有些时候我们需要把左链接右旋。右旋代码和左旋几乎一致,只需要把left和right颠倒即可
左旋和右旋操作都维持树的对称性,并且都没有操作其他节点
变色:如果一个节点两个子节点链接均为红色,将两个链接变为黑色,并将父节点变为红色,该操作等同于2-3树里临时4节点的分裂
插入操作:
情况1:对单个节点插入
插入节点链接为红色,如小于原节点则插入到左边,如大于原节点插入到右边,然后左旋
情况2:对双节点插入
2.1插入节点链接为红色,如大于两个节点插入到右边,然后变色
2.2如小于两个节点插入到左边,然后对根节点右旋,转化为2.1的情况,进行变色
2.3 如在两个节点之间插入到原左节点的右节点,此时红边在原左节点右侧,左旋 ,转化为情况2.2,然后右旋,变色