紅黑樹

紅黑樹有兩種結構,物理結構和邏輯結構。

在物理結構的表現上,紅黑樹是一顆二叉樹。
在邏輯結構的表現上,紅黑樹是2-3樹,紅色連接表示兩個2-節點鏈接成構成一個3-節點,黑連接則是2-3樹的普通連接。java

紅黑樹的定義:

  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; //返回旋轉後上去的節點
}

右旋轉:code

紅黑樹的插入規則

  1. 向2-節點插入新節點
  2. 向3-節點插入新節點

2-節點插入規則:
1.左插紅節點
2.右插紅節點,左旋轉ip

3-節點插入規則:
1. 右插紅節點,則左紅,右紅都變黑
2. 左插紅節點,右旋轉,變成1
3. 中插紅節點,左旋轉,變成2class

插入算法二叉樹

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》方法

相關文章
相關標籤/搜索