希望详细介绍下红黑树原理,如何用java实现自定义的红黑树
// 有帮助,请采纳,谢谢
import com.sun.org.apache.regexp.internal.RE;
/**
* @description: 自定义红黑树
* @author: liangrui
* @create: 2019-12-24 13:50
**/
public class RedBlackTree<K extends Comparable<K>,V> {
private static final boolean RED=true;
private static final boolean BLACK=false;
private class Node{
public K key;
public V value;
public Node left,right;
public boolean color;
public Node(K key,V value){
this.key=key;
this.value=value;
left=null;
right=null;
color=RED;
}
}
private Node root;
private int size;
public RedBlackTree(){
root=null;
size=0;
}
public int getSize(){
return size;
}
public boolean isEmpty(){
return size==0;
}
/**
* 判断节点node的颜色
* @param node
* @return
*/
private boolean isRed(Node node){
if (node==null){
return BLACK;
}
return node.color;
}
// node x
// / \ 左旋转 / \
// T1 x ---------> node T3
// / \ / \
// T2 T3 T1 T2
private Node leftRotate(Node node){
Node x=node.right;
//左旋转
node.right=x.left;
x.left=node;
x.color=node.color;
node.color=RED;
return x;
}
// node x
// / \ 右旋转 / \
// x T2 -------> y node
// / \ / \
// y T1 T1 T2
private Node rightRotate(Node node){
Node x=node.left;
//右旋转
node.left=x.right;
x.right=node;
x.color=node.color;
node.color=RED;
return x;
}
/**
* 颜色翻转
* @param node
*/
private void flipColors(Node node){
node.color=RED;
node.left.color=BLACK;
node.right.color=BLACK;
}
/**
* 向红黑树中添加新的元素(key,value)
* @param key
* @param value
*/
public void add(K key,V value){
root=add(root,key,value);
root.color=BLACK;
}
/**
* 向以node为根的红黑树中插入元素(key,value),递归算法
* @param node
* @param key
* @param value
* @return 返回插入新节点后红黑树的根
*/
private Node add(Node node, K key, V value) {
if (node==null){
size++;
return new Node(key, value);//默认插入红色节点
}
if (key.compareTo(node.key)<0){
node.left=add(node.left,key,value);
}else if (key.compareTo(node.key)>0){
node.right=add(node.right,key,value);
}else {
node.value=value;
}
if (isRed(node.right)&&!isRed(node.left)){
node=leftRotate(node);
}
if (isRed(node.left)&&isRed(node.left.left)){
node=rightRotate(node);
}
if (isRed(node.left)&&isRed(node.right)){
flipColors(node);
}
return node;
}
// 返回以node为根节点的二分搜索树中,key所在的节点
private Node getNode(Node node, K key){
if(node == null)
return null;
if(key.equals(node.key))
return node;
else if(key.compareTo(node.key) < 0)
return getNode(node.left, key);
else // if(key.compareTo(node.key) > 0)
return getNode(node.right, key);
}
public boolean contains(K key){
return getNode(root, key) != null;
}
public V get(K key){
Node node = getNode(root, key);
return node == null ? null : node.value;
}
public void set(K key, V newValue){
Node node = getNode(root, key);
if(node == null)
throw new IllegalArgumentException(key + " doesn't exist!");
node.value = newValue;
}
}