红黑树的基本实现
public class TreeBlackBST <Key extends Comparable<Key>,Value>
{
private Node root;
private static final boolean RED= true;
private static final boolean BLACK= false;
private class Node(){
private Key key;//key属性
private Value value;//value属性
private Node left,right;//定义左右节点
private int N;//树的节点数
private boolean color;//节点颜色
public int size(Node node){
return node.N;
}
public boolean isRed(Node node){
if(node==null) return false;
return node.color == RED;
}
public boolean isEmpty(Node node){
return node.N == 0;
}
//初始化
public Node(Key key, Value value, int n, boolean color) {
this.key = key;
this.value = value;
N = n;
this.color = color;
}
//如果左左都为红色则进行右旋
private Node rotateLeft(Node h){
Node x = h.right;
h.right = x.left;
x.left = h;
x.color = RED;
x.N = h.N;
h.N = 1 + size(h.left) + size(h.right);
return x;
}
//左红右黑左旋
private Node rotateRight(Node h){
Node x = h.left;
x.left = x.right;
x.right = h;
x.color = RED;
x.N = h.N;
h.N = 1 + size(x.left) + size(x.right);
return x;
}
//如果节点的左右节点都是红色则将该节点设为红色 左右设为黑色
private Node filpColors(Node h){
h.color = RED;
h.left.color = BLACK;
h.right.color = BLACK;
return h;
}
private void put(Key key,Value value){
root = put(root,key,value);
root.color = BLACK;
}
private Node put(Node node,Key key,Value value){
//递归添加元素
if (node == null)
return new Node(key,value,1,RED);
int cmp = key.compareTo(node.key);
if (cmp < 0)
node.left = put(node.left,key,value);
else if (cmp > 0)
node.right = put(node.right,key,value);
else node.value = value;
//对树结构旋转
if (isRed(node.right) && !isRed(node.left))
node.rotateLeft(node);
if (isRed(node.left) && isRed(node.left.left))
node.rotateRight(node);
if (isRed(node.left) && isRed(node.right))
node.filpColors(node);
node.N = 1 + size(node.right) + size(node.left);
return node;
}
}
}