enum Color{
BLACK, RED
}
class RBNode<T extends Comparable>{
private T data;
private RBNode left;
private RBNode right;
private RBNode parent;
private Color color;
public RBNode(T data, RBNode<T> left, RBNode<T> right, RBNode<T> parent, Color color) {
this.data = data;
this.left = left;
this.right = right;
this.parent = parent;
this.color = color;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public RBNode<T> getLeft() {
return left;
}
public void setLeft(RBNode<T> left) {
this.left = left;
}
public RBNode<T> getRight() {
return right;
}
public void setRight(RBNode<T> right) {
this.right = right;
}
public RBNode<T> getParent() {
return parent;
}
public void setParent(RBNode<T> parent) {
this.parent = parent;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
}
class RBTree<T extends Comparable>{
private RBNode root;
public RBTree() {
this.root = null;
}
private void leftRotate(RBNode<T> node){
RBNode<T> child = node.getRight();
child.setParent(node.getParent());
if(node.getParent() == null){
this.root = child;
} else {
if(node.getParent().getLeft() == node){
node.getParent().setLeft(child);
} else {
node.getParent().setRight(child);
}
}
node.setRight(child.getLeft());
if(child.getLeft() != null){
child.getLeft().setParent(node);
}
child.setLeft(node);
node.setParent(child);
}
private void rightRotate(RBNode<T> node){
}
private Color color(RBNode<T> node){
return node == null ? Color.BLACK : node.getColor();
}
public void setColor(RBNode<T> node, Color color){
node.setColor(color);
}
public RBNode<T> left(RBNode<T> node){
return node.getLeft();
}
public RBNode<T> right(RBNode<T> node){
return node.getRight();
}
public RBNode<T> parent(RBNode<T> node){
return node.getParent();
}
}
private void fixAfterInsert(RBNode node) {
while(color(parent(node)) == Color.RED){
if(left(parent(parent(node))) == parent(node)){
// 当前节点,父节点在祖先节点的左子树
RBNode uncle = right(parent(parent(node)));
if(color(uncle) == Color.RED){ // 插入情况1
setColor(parent(node), Color.BLACK);
setColor(uncle, Color.BLACK);
setColor(parent(parent(node)), Color.RED);
node = parent(parent(node));
} else {
if(node == right(parent(node))){ // 插入情况3前半段
node = parent(node);
leftRotate(node);
}
setColor(parent(node), Color.BLACK); // 插入情况3后半段和情况2合并
setColor(parent(parent(node)), Color.RED);
rightRotate(parent(parent(node)));
}
} else {
// 当前节点,父节点在祖先节点的右树
RBNode<T> uncle = left(parent(parent(node)));
if(color(uncle) == Color.RED){ // 插入情况1
setColor(parent(node), Color.BLACK);
setColor(uncle, Color.BLACK);
setColor(parent(parent(node)), Color.RED);
node = parent(parent(node));
} else {
if(node == left(parent(node))){ // 插入情况3前半段
node = parent(node);
rightRotate(node);
}
setColor(parent(node), Color.BLACK); // 插入情况3后半段和情况2合并
setColor(parent(parent(node)), Color.RED);
leftRotate(parent(parent(node)));
}
}
}
// 有可能向上回溯到根节点跳出,把根节点置成黑色
setColor(this.root, Color.BLACK);
}
安静 2019/7/12 16:21:43