java 红黑树实现与详解

希望详细介绍下红黑树原理,如何用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;
    }
}