Map分支—TreeMap

6 篇文章 0 订阅
用红黑树实现,非线程安全

继承关系:
extends AbstractMap< K , V implements NavigableMap<K,V>, Cloneable, java.io.Serializable

属性:

//比较器
private final Comparator<? super K > comparator ;
//根节点
private transient Entry< K , V > root = null;
//元素个数
private transient int size = 0 ;
//修改次数
private transient int modCount = 0 ;
获取第一个key
final Entry< K , V > getCeilingEntry ( K key) {
    Entry< K , V > p = root ;
    while (p != null ) {
        int cmp = compare(key , p. key ) ;
        if (cmp < 0 ) {
            if (p. left != null )
                p = p. left ;
            else
                return p ;
        } else if (cmp > 0 ) {
            if (p. right != null ) {
                p = p. right ;
            } else {
                Entry< K , V > parent = p. parent ;
                Entry< K , V > ch = p ;
                while (parent != null && ch == parent. right ) {
                    ch = parent ;
                    parent = parent. parent ;
                }
                return parent ;
            }
        } else
            return p ;
    }
    return null;
}
深度优先的先根遍历

获取第一个大于等于key的元素
final Entry< K , V > getHigherEntry ( K key) {
    Entry< K , V > p = root ;
    while (p != null ) {
        int cmp = compare(key , p. key ) ;
        if (cmp < 0 ) {
            if (p. left != null )
                p = p. left ;
            else
                return p ;
        } else {
            if (p. right != null ) {
                p = p. right ;
            } else {
                Entry< K , V > parent = p. parent ;
                Entry< K , V > ch = p ;
                while (parent != null && ch == parent. right ) {
                    ch = parent ;
                    parent = parent. parent ;
                }
                return parent ;
            }
        }
    }
    return null;
}

put操作:
public V put( K key , V value) {
    Entry< K , V> t = root ;
    if (t == null) {
        compare(key , key) ; // type (and possibly null) check

        root = new Entry<>(key , value , null) ;
        size = 1 ;
        modCount++ ;
        return null;
    }
    int cmp ;
    Entry< K , V> parent ;
    // split comparator and comparable paths
    Comparator<? super K> cpr = comparator ;
    if (cpr != null) {
        do {
            parent = t ;
            cmp = cpr.compare(key , t. key) ;
            if (cmp < 0)
                t = t. left ;
            else if (cmp > 0)
                t = t. right ;
            else
                return t.setValue(value) ;
        } while (t != null) ;
    }
    else {
        if (key == null)
            throw new NullPointerException() ;
        Comparable<? super K> k = (Comparable<? super K>) key ;
        do {
            parent = t ;
            cmp = k.compareTo(t. key) ;
            if (cmp < 0)
                t = t. left ;
            else if (cmp > 0)
                t = t. right ;
            else
                return t.setValue(value) ;
        } while (t != null) ;
    }
    Entry< K , V> e = new Entry<>(key , value , parent) ;
    if (cmp < 0)
        parent. left = e ;
    else
        parent. right = e ;
    fixAfterInsertion(e) ;
    size++ ;
    modCount++ ;
    return null;
}
如果没有这个key就变成了添加元素,添加元素后,要调整红黑树结构。
private void fixAfterInsertion(Entry< K , V> x) {
    x. color = RED ;

    while (x != null && x != root && x. parent. color == RED) {
        if ( parentOf(x) == leftOf( parentOf( parentOf(x)))) {
            Entry< K , V> y = rightOf( parentOf( parentOf(x))) ;
            if ( colorOf(y) == RED) {
                setColor( parentOf(x) , BLACK) ;
                setColor(y , BLACK) ;
                setColor( parentOf( parentOf(x)) , RED) ;
                x = parentOf( parentOf(x)) ;
            } else {
                if (x == rightOf( parentOf(x))) {
                    x = parentOf(x) ;
                    rotateLeft(x) ;
                }
                setColor( parentOf(x) , BLACK) ;
                setColor( parentOf( parentOf(x)) , RED) ;
                rotateRight( parentOf( parentOf(x))) ;
            }
        } else {
            Entry< K , V> y = leftOf( parentOf( parentOf(x))) ;
            if ( colorOf(y) == RED) {
                setColor( parentOf(x) , BLACK) ;
                setColor(y , BLACK) ;
                setColor( parentOf( parentOf(x)) , RED) ;
                x = parentOf( parentOf(x)) ;
            } else {
                if (x == leftOf( parentOf(x))) {
                    x = parentOf(x) ;
                    rotateRight(x) ;
                }
                setColor( parentOf(x) , BLACK) ;
                setColor( parentOf( parentOf(x)) , RED) ;
                rotateLeft( parentOf( parentOf(x))) ;
            }
        }
    }
    root. color = BLACK ;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值