红黑树的java实现

public class RbTree<K extends Comparable,V> {
    
    /** 跟节点 */
    private Entity<K,V> root;

    /** 数量 */
    private int size = 0;


    /**
     * 增加节点<br>
     * @param key 键
     * @param vaule 值
     */
    public void addNode(K key,V vaule){
        if(Objects.isNull(key)){
            return;
        }
        if(root == null){
            Entity node = new Entity(key,vaule);
            root = node;
            root.color=true;
            size++;
            return;
        }
        Entity currentNode = root;
        Entity parentNode = root;
        int compare = 0;
        while(currentNode != null){
            parentNode = currentNode;
            if((compare = currentNode.key.compareTo(key)) > 0){
                currentNode = currentNode.left;
            }else if(compare < 0){
                currentNode = currentNode.right;
            }else{
                //相等重新赋值
                currentNode.setVal(vaule);
                return;
            }
        }
        Entity node = new Entity(key,vaule,parentNode);
        if(compare >0){
            parentNode.left = node;
        }else{
            parentNode.right = node;
        }
        insertFixup(node);
        size++;
    }

    /**
     * 根据key删除节点
     * @param key
     */
    public void delNode(K key){
        if(Objects.isNull(key)){
            System.out.println("key不能为空");
            return;
        }
        Entity dNode = findNode(key);
        if(Objects.isNull(dNode)){
            System.out.println("key不存在:"+key);
            return;
        }
        if(Objects.nonNull(dNode.left) && Objects.nonNull(dNode.right)){
            Entity p = successor(dNode);
            if(p != null){
                dNode.key = p.key;
                dNode.val = p.val;
                dNode = p;
            }
        }
        //替换节点
        Entity replaceNode = dNode.left != null ? dNode.left : dNode.right;
        if(Objects.nonNull(replaceNode)){
            replaceNode.parent = dNode.parent;
            if(replaceNode.parent == null){
                root = replaceNode;
            }else if(dNode == leftOf(dNode.parent)){
                dNode.parent.left =  replaceNode;
            }else{
                dNode.parent.right =  replaceNode;
            }
            dNode.val = dNode.parent = null;
            dNode.key = null;
            //黑色节点
            if(dNode.color){
                delFixup(replaceNode);
            }
        }else if(dNode.parent == null){
            root = null;
        }else{
            //黑色节点
            if(dNode.color){
                delFixup(dNode);
            }
            if(dNode == leftOf(dNode.parent)){
                dNode.parent.left = null;
            }else{
                dNode.parent.right = null;
            }
            dNode.parent = null;
            dNode.key = null;
            dNode.val = null;
        }


    }

    private void delFixup(Entity dNode){
        while(dNode != root && dNode.color){
            if(leftOf(parentOf(dNode)) == dNode){
                Entity sib = rightOf(parentOf(dNode));
                if(!sib.color){
                    sib.color = true;
                    parentOf(dNode).color = false;
                    leftRotate(parentOf(dNode));
                    sib = parentOf(dNode).right;
                }
                if(leftOf(sib).color && rightOf(sib).color){
                    sib.color = false;
                    dNode = dNode.parent;
                }else{
                    if(!leftOf(sib).color){
                        sib.color = false;
                        rightOf(sib).color = true;
                        rightRotate(sib);
                        sib = sib.parent;
                    }
                    rightOf(sib).color = true;
                    leftRotate(dNode.parent);
                    boolean color = dNode.parent.color;
                    dNode.parent.color = dNode.parent.parent.color;
                    dNode.parent.parent.color=color;
                    dNode = root;
                }
            }else{
                //获取兄弟节点
                Entity sib = leftOf(parentOf(dNode));
                //如果兄弟节点为红色
                if(!colorOf(sib)){
                    dNode.parent.color = false;
                    sib.color = true;
                    rightRotate(parentOf(dNode));
                    sib = leftOf(parentOf(dNode));
                }
                //兄弟和子节点全部是黑色
                if(rightOf(sib).color && leftOf(sib).color){
                    sib.color = false;
                    dNode = dNode.parent;
                }else{
                    if(!rightOf(sib).color){
                        rightOf(sib).color = true;
                        sib.color = false;
                        leftRotate(sib);
                        sib = sib.parent;
                    }
                    leftOf(sib).color = true;
                    rightRotate(dNode.parent);
                    boolean color = dNode.parent.color;
                    dNode.parent.color = dNode.parent.parent.color;
                    dNode.parent.parent.color=color;
                    dNode = root;
                }
            }
        }
        //当替换节点为红色是直接改成黑色即可
        dNode.color = true;
    }
    private Entity successor(Entity dNode){
        if(dNode == null){
            return null;
        }else if(Objects.nonNull(dNode.right)){
            Entity node = dNode.right;
            while(Objects.nonNull(node.left)){
                node = node.left;
            }
            return node;
        }else{
            return null;
        }
    }
    /**
     * 根据key查询节点 <br/>
     * @param key
     * @return
     */
    private Entity findNode(K key){
        if(root == null){
            return null;
        }
        Entity current = root;
        int compare = 0;
        while(current != null){

            if((compare = current.key.compareTo(key)) > 0){
                current = current.left;
            }else if(compare < 0){
                current = current.right;
            }else{
                return current;
            }
        }
        return null;
    }
    /**
     * 插入修正<br/>
     * @param  node 插入节点
     *
     */
    private void insertFixup(Entity node){
        if(Objects.isNull(node.parent)){
            node.color = true;
        }else if(!node.parent.color){//父节点为红色
            //父节点
            Entity p = parentOf(node);
            Entity pp = pparentOf(node);
            //父节点是左节点
            if(leftOf(pp) == p){
                if(!colorOf(rightOf(pp))){
                    p.color=true;
                    rightOf(pp).color = true;
                    pp.color=false;
                    insertFixup(pp);
                }else{
                    if(rightOf(p) == node){
                        leftRotate(p);
                        node = p;
                    }
                    parentOf(node).color = true;
                    pp.color = false;
                    rightRotate(pp);
                }

            }else{//是右节点
                if(!colorOf(leftOf(pp))){
                    p.color=true;
                    leftOf(pp).color= true;
                    pp.color = false;
                    insertFixup(pp);
                }else{
                    if(leftOf(p) == node){
                        rightRotate(p);
                        node = p;
                    }
                    parentOf(node).color = true;
                    pp.color = false;
                    leftRotate(pp);
                }
            }
        }else{
            //NO LOOP 父节点为黑色不操作
        }
    }


    /**
     * 返回节点颜色
     * @param node
     * @return
     */
    private Boolean colorOf(Entity node){
        return node == null?true:node.color;
    }

    /**
     * 返回左节点
     * @param node
     * @return
     */
    private Entity leftOf(Entity node){
        return node == null?null:node.left;
    }

    /**
     * 返回右节点
     * @param node
     * @return
     */
    private Entity rightOf(Entity node){
        return node == null?null:node.right;
    }
    /**
     *
     * @param node
     * @return
     */
    private Entity parentOf(Entity node){
        return node == null?null:node.parent;
    }
    /**
     *
     * @param node
     * @return
     */
    private Entity pparentOf(Entity node){
        return parentOf(parentOf(node));
    }
    /**
     * 左旋转<br/>
     * @param node 节点
     */
    private void leftRotate(Entity node){
        Entity rightNode = node.right;
        if (rightNode == null){
            return;
        }
        Entity rightLeftNode = rightNode.left;
        node.right = rightLeftNode;
        if(Objects.nonNull(rightLeftNode)){
            rightLeftNode.parent = node;
        }
        if(node.parent != null){
            if(node.parent.left == node){
                node.parent.left = rightNode;
            }else{
                node.parent.right = rightNode;
            }
        }else{
            root = rightNode;
        }
        rightNode.parent = node.parent;
        node.parent = rightNode;
        rightNode.left = node;
    }

    /**
     * 右旋转<br/>
     * @param node 节点
     */
    private void rightRotate(Entity node){
        //左节点
        Entity left = node.left;
        if(left == null){
            return;
        }
        Entity leftRightNode = left.right;
        node.left = leftRightNode;
        if(Objects.nonNull(leftRightNode)){
            leftRightNode.parent = node;
        }
        if(node.parent == null){
            root = left;
        }else{
            if(node.parent.left == node){
                node.parent.left = left;
            }else{
                node.parent.right = left;
            }
        }
        left.parent = node.parent;
        left.right = node;
        node.parent = left;

    }
    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    static class Entity<K extends Comparable,V>{

        Entity(K key,V val){
            this.key = key;
            this.val = val;
        }
        Entity(K key,V val,Entity parent){
            this.key = key;
            this.val = val;
            this.parent = parent;
        }
        private K key;

        private V val;

        private Entity left;

        private Entity right;

        private Entity parent;

        /** true:黑色  false:红色 默认红色*/
        private boolean color = false;
        public Object getVal() {
            return val;
        }

        public K getKey() {
            return key;
        }

        public void setKey(K key) {
            this.key = key;
        }

        public void setVal(V val) {
            this.val = val;
        }

        public boolean isColor() {
            return color;
        }

        public void setColor(boolean color) {
            this.color = color;
        }

        public Entity getLeft() {
            return left;
        }

        public void setLeft(Entity left) {
            this.left = left;
        }

        public Entity getRight() {
            return right;
        }

        public void setRight(Entity right) {
            this.right = right;
        }

        public Entity getParent() {
            return parent;
        }

        public void setParent(Entity parent) {
            this.parent = parent;
        }
    }

转载于:https://my.oschina.net/u/2504004/blog/3021847

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值