package algs4;
/**
* Created by blank on 2015-10-15 上午10:08.
*/
public class RedBlackTree {
private Node root;
public void put(Key key, Value value) {
root = put(root, key, value);
root.color = BLACK;
}
private Node put(Node h, Key key, Value value) {
if (h == null) {
return new Node(key, value, 1, RED);
}
int cmp = key.compareTo(h.key);
if (cmp < 0) {
h.left = put(h.left, key, value);
} else if (cmp > 0) {
h.right = put(h.right, key, value);
} else {
h.value = value;
}
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);
}
h.N = size(h.left) + size(h.right) + 1;
return h;
}
void flipColors(Node h) {
h.color = RED;
h.left.color = BLACK;
h.right.color = BLACK;
}
Node rotateLeft(Node h) {
Node x = h.right;
h.right = x.left;
x.left = h;
x.color = h.color;
h.color = RED;
x.N = h.N;
h.N = 1 + size(h.left) + size(h.right);
return x;
}
Node rotateRight(Node h) {
Node x = h.left;
h.left = x.right;
x.right = h;
x.color = h.color;
h.color = RED;
x.N = h.N;
h.N = 1 + size(h.left) + size(h.right);
return x;
}
int size(Node x) {
return x.N;
}
static class Key implements Comparable<Key> {
int val;
@Override
public int compareTo(Key o) {
return val - o.val;
}
}
private boolean isRed(Node x) {
return x != null && x.color;
}
static class Value {
String val;
}
public static final boolean RED = true;
public static final boolean BLACK = false;
static class Node {
Key key;
Value value;
Node left, right;
int N;
boolean color;
public Node(Key key, Value value, int n, boolean color) {
this.key = key;
this.value = value;
N = n;
this.color = color;
}
}
}