红黑树有两种结构,物理结构和逻辑结构。

在物理结构的表现上,红黑树是一颗二叉树。
在逻辑结构的表现上,红黑树是2-3树,红色链接表示两个2-节点连接成构成一个3-节点,黑链接则是2-3树的普通链接。

红黑树的定义:

  1. 二叉查找树
  2. 红链接均为左链接
  3. 没有任何一个节点同时和两条红链接相连(如果有这样的节点就不再是3-节点,而是变成了4-节点)
    4.任意空链接到根节点的路径上的黑链接数量相同

红黑树的优点:

  1. 二叉树简洁高效的查找方法
  2. 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; //返回旋转后上去的节点
}

右旋转:

红黑树的插入规则

  1. 向2-节点插入新节点
  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》


LuCoder
10 声望1 粉丝

技术宅男


下一篇 »
线程Thread