直接上代码
public class RedBlackTree<Key extends Comparable<Key>, Value> {
/** 根节点 */
private Node root;
/** 节点数 */
private int n;
private static boolean RED = true;
private static boolean BLACK = false;
/**
* 节点类定义
*/
public class Node{
public Key key;
public Value value;
public Node left;
public Node right;
public boolean color;
public Node(Key key, Value value, Node left, Node right, boolean color) {
super();
this.key = key;
this.value = value;
this.left = left;
this.right = right;
this.color = color;
}
}
public int size(){
return n;
}
//节点是否为红色
private boolean isRed(Node node){
return node != null && node.color;
}
//左旋
private Node rotateLeft(Node node){
//1.获取node节点的右子节点 记作 rNode
Node rNode = node.right;
//2.让rNode节点的左子节点变为node节点的右子节点
rNode.right = node.left;
//3.让node节点变为rNode节点的左子节点
rNode.left = node;
//4.让rNode的color属性变为node的color属性
rNode.color = node.color;
//5.让node节点的color属性变为red
node.color = RED;
return rNode;
}
//右旋
private Node rotateRight(Node node){
//1.获取node节点的左子节点 记作 lNode
Node lNode = node.left;
//2.让node节点的左子节点变为lNode节点的右子节点
node.left = lNode.right;
//3.让node节点变为lNode节点的右子节点
lNode.right = node;
//4.让lNode的color属性变为node的color属性
lNode.color = node.color;
//5.让node节点的color属性变为red
node.color = RED;
return lNode;
}
//颜色反转
private void flipColor(Node node){
node.color = RED;
node.left.color = BLACK;
node.right.color = BLACK;
}
/**
* 添加
*/
public void put(Key key, Value value){
root = put(root, key, value);
if(root != null) root.color = BLACK;
}
/**
* 添加数据到指定节点下
*/
private Node put(Node node, Key key, Value value){
if(node == null){
n ++;
return new Node(key, value, null, null, RED);
}
//比较key
int compareTo = key.compareTo(node.key);
if(compareTo < 0){
node.left = put(node.left, key, value);
}else if(compareTo > 0){
node.right = put(node.right, key, value);
}else{
node.value = value;
}
//是否需要左旋
if(!isRed(node.left) && isRed(node.right))
node = rotateLeft(node);
//是否需要右旋
if(isRed(node.left) && isRed(node.left.left))
node = rotateRight(node);
//是否需要颜色反转
if(isRed(node.left) && isRed(node.right))
flipColor(node);
return node;
}
/**
* 获取
*/
public Value get(Key key){
return get(root, key);
}
private Value get(Node node, Key key){
if(node == null) return null;
int compareTo = key.compareTo(node.key);
if(compareTo < 0){
//向左查找
return get(node.left,key);
}else if(compareTo > 0){
//向右查找
return get(node.right,key);
}else{
//返回结果
return node.value;
}
}
}