红黑树的基本实现

红黑树的基本实现

public class TreeBlackBST <Key extends Comparable<Key>,Value>
{
    private Node root;
    private static final boolean RED= true;
    private static final boolean BLACK= false;
    private class  Node(){

        private Key key;//key属性
        private Value value;//value属性
        private Node left,right;//定义左右节点
        private int N;//树的节点数
        private boolean color;//节点颜色
        public int size(Node node){
            return node.N;
        }
        public boolean isRed(Node node){
            if(node==null) return false;
            return node.color == RED;
        }
        public boolean isEmpty(Node node){
            return node.N == 0;
        } 
        //初始化
        public Node(Key key, Value value, int n, boolean color) {
            this.key = key;
            this.value = value;
            N = n;
            this.color = color;
        }
        //如果左左都为红色则进行右旋
         private Node rotateLeft(Node h){
            Node x = h.right;
            h.right = x.left;
            x.left = h;
            x.color = RED;
            x.N = h.N;
            h.N = 1 + size(h.left) + size(h.right);
            return x;
        }
        //左红右黑左旋
        private Node rotateRight(Node h){
            Node x = h.left;
            x.left = x.right;
            x.right = h;
            x.color = RED;
            x.N = h.N;
            h.N = 1 + size(x.left) + size(x.right);
            return x;
        }
        //如果节点的左右节点都是红色则将该节点设为红色 左右设为黑色
        private  Node filpColors(Node h){
            h.color = RED;
            h.left.color = BLACK;
            h.right.color = BLACK;
            return h;
        }
        private void put(Key key,Value value){
            root = put(root,key,value);
            root.color = BLACK;
        }
        private Node put(Node node,Key key,Value value){
            //递归添加元素
            if (node == null)
                return new Node(key,value,1,RED);
            int cmp = key.compareTo(node.key);
            if (cmp < 0)
                node.left = put(node.left,key,value);
            else if (cmp > 0)
                node.right = put(node.right,key,value);
            else  node.value = value;

            //对树结构旋转
            if (isRed(node.right) && !isRed(node.left))
                node.rotateLeft(node);
            if (isRed(node.left) && isRed(node.left.left))
                node.rotateRight(node);
            if (isRed(node.left) && isRed(node.right))
                node.filpColors(node);
            node.N = 1 + size(node.right) + size(node.left);
            return node;
        }
        
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值