红黑树有两种结构,物理结构和逻辑结构。
在物理结构的表现上,红黑树是一颗二叉树。
在逻辑结构的表现上,红黑树是2-3树,红色链接表示两个2-节点连接成构成一个3-节点,黑链接则是2-3树的普通链接。
红黑树的定义:
- 二叉查找树
- 红链接均为左链接
- 没有任何一个节点同时和两条红链接相连(如果有这样的节点就不再是3-节点,而是变成了4-节点)
4.任意空链接到根节点的路径上的黑链接数量相同
红黑树的优点:
- 二叉树简洁高效的查找方法
- 2-3树高效的平衡插入算法
红黑树的数据结构:
private static final boolean RED = true;
private static final boolean BLACK = false;
class Node
{
Key key;
Val val;
Node left;
Node right;
Bool color;
}
一个节点的左节点是红节点,则表示左节点和这个节点构成一个3-节点
旋转:红黑树内部操作的基本原语
左旋转:
Node rotateLeft(Node root)
{
Node right = root.right;
root.right = right.left; //右节点的左子树给了根节点的右子树
right.left = root; //右节点把根节点作为左子树,完成旋转
root.color = right.color
right.color = RED;
return right; //返回旋转后上去的节点
}
右旋转:
红黑树的插入规则
- 向2-节点插入新节点
- 向3-节点插入新节点
2-节点插入规则:
1.左插红节点
2.右插红节点,左旋转
3-节点插入规则:
1. 右插红节点,则左红,右红都变黑
2. 左插红节点,右旋转,变成1
3. 中插红节点,左旋转,变成2
插入算法
public class ReadBlackBST
{
private Node put(Node h, Key key, Val val)
{
if(h == null) return new Node(key, val, 1, RED);
int cmp = key.compareTo(h.key);
if (cmp < 0) h.left = put(h.left, key, val);
else if(cmp > 0) h.right = put(h.right, key, val);
else h.val = val;
if(isRed(h.right) && !isRed(h.left)) h = rotateLeft(h);
if(isRed(h.left) && isRed(h.left.left)) h = rotateRight(h);
if(isRed(h.left)&& isRed(h.right)) flipColors(h);
return h;
}
}
文章中所有代码摘自《算法4》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。