在物理結構的表現上,紅黑樹是一顆二叉樹。
在邏輯結構的表現上,紅黑樹是2-3樹,紅色連接表示兩個2-節點鏈接成構成一個3-節點,黑連接則是2-3樹的普通連接。java
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
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》方法