特点
- 节点颜色有红色和黑色
- 根节点必为黑色
- 所有叶子节点都是黑色
- 不会有连续的红色节点
代码
package tree.rbt;
public class RBTree <K extends Comparable<K>,V>{
private static final boolean RED = true;
private static final boolean BLACK = false;
private RBNode root;
public void inOrderPrint(){
inOrderPrint(this.root);
}
private void inOrderPrint(RBNode root){
if (root != null){
inOrderPrint(root.left);
System.out.println("key:"+root.key+",value:"+root.value);
inOrderPrint(root.right);
}
}
public RBNode getRoot() {
return root;
}
public void insert(K key,V value){
RBNode node = new RBNode();
node.setKey(key);
node.setValue(value);
node.setColor(RED);
insert(node);
}
private void insert(RBNode node){
RBNode parent = null;
RBNode x = this.root;
while(x != null){
parent = x;
int cmp = node.key.compareTo(x.key);
if (cmp > 0){
x = x.right;
}else if(cmp < 0){
x = x.left;
}else{
x.setValue(node.getValue());
return;
}
}
node.parent = parent;
if (parent != null){
int cmp = node.key.compareTo(parent.key);
if (cmp > 0){
parent.right = node;
}else{
parent.left = node;
}
}else{
this.root = node;
}
insertFixup(node);
}
public void insertFixup(RBNode node){
this.root.setColor(BLACK);
RBNode parent = parentOf(node);
RBNode gparent = parentOf(parent);
if (parent != null && isRed(parent)){
RBNode uncle = null;
if (parent == gparent.left){
uncle = gparent.right;
if (uncle != null && isRed(uncle)){
setBlack(uncle);
setBlack(parent);
setRed(gparent);
insertFixup(gparent);
return;
}
if (uncle == null || isBlack(uncle)){
if (node == parent.left){
setBlack(parent);
setRed(gparent);
rightRotate(gparent);
return;
}
if (node == parent.right){
leftRotate(parent);
insertFixup(parent);
return;
}
}
}else{
uncle = gparent.left;
if (uncle != null && isRed(uncle)){
setBlack(uncle);
setBlack(parent);
setRed(gparent);
insertFixup(gparent);
return;
}
if (uncle == null || isBlack(uncle)){
if (node == parent.right){
setBlack(parent);
setRed(gparent);
leftRotate(gparent);
return;
}
if (node == parent.left){
rightRotate(parent);
insertFixup(parent);
return;
}
}
}
}
}
private void leftRotate(RBNode x){
RBNode y = x.right;
x.right = y.left;
if (y.left != null){
y.left.parent = x;
}
if (x.parent != null){
y.parent = x.parent;
if (x == x.parent.left){
x.parent.left = y;
}else{
x.parent.right = y;
}
}else{
this.root = y;
}
x.parent = y;
y.left = x;
}
private void rightRotate(RBNode y){
RBNode x = y.left;
y.left = x.right;
if (x.right != null){
x.right.parent = y;
}
if (y.parent != null){
if (y.parent.left == y){
y.parent.left = x;
}else {
y.parent.right = x;
}
}else{
this.root = x;
}
y.parent = x;
x.right = y;
}
private RBNode parentOf(RBNode node){
if (node != null){
return node.parent;
}
return null;
}
private boolean isRed(RBNode node){
if (node != null){
return node.color == RED;
}
return false;
}
private boolean isBlack(RBNode node){
if (node != null){
return node.color == BLACK;
}
return false;
}
private void setRed(RBNode node){
if (node != null){
node.color = RED;
}
}
private void setBlack(RBNode node){
if (node != null){
node.color = BLACK;
}
}
static class RBNode <K extends Comparable<K>,V>{
private RBNode parent;
private RBNode left;
private RBNode right;
private boolean color;
private K key;
private V value;
public RBNode() {
}
public RBNode(RBNode parent, RBNode left, RBNode right, boolean color, K key, V value) {
this.parent = parent;
this.left = left;
this.right = right;
this.color = color;
this.key = key;
this.value = value;
}
public RBNode getParent() {
return parent;
}
public void setParent(RBNode parent) {
this.parent = parent;
}
public RBNode getLeft() {
return left;
}
public void setLeft(RBNode left) {
this.left = left;
}
public RBNode getRight() {
return right;
}
public void setRight(RBNode right) {
this.right = right;
}
public boolean isColor() {
return color;
}
public void setColor(boolean color) {
this.color = color;
}
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public V getValue() {
return value;
}
public void setValue(V value) {
this.value = value;
}
}
}