红黑树 TreeMap

https://www.jianshu.com/p/2484cc533487 
https://www.cnblogs.com/CarpenterLee/p/5503882.html 
https://www.cnblogs.com/CarpenterLee/p/5525688.html

 

红黑树是一种特殊的二叉查找树,其红黑特性保证了每个节点的左右子树高度差不超过两倍,所以红黑树是一种接近平衡的二叉查找树。

  AVL树的查找,插入,删除的时间复杂度都为O(log n)

二叉查找树的特性

1.对于树中的每个节点T(T可能是父节点),它的左子树中所有的值都小于T中的值
2.对于树中每个节点T,它的右子树中所有的值都大于T中的值。

AVL树与红黑树的区别

        首先AVL树比红黑树更平衡,在插入和删除操作时就更容易引起树的旋转操作来维持树的平衡性。在大量数据需要插入和删除的场景中,AVL树的rebalance的频率会大幅度上升。而红黑树是不符合AVL树的平衡条件的,红黑树用非严格的平衡来换取旋转次数的降低,任何的rebalance都能在三次旋转内完成,并且红黑树的时间复杂度也为O(log n),所以在实际应用中,红黑树的使用会更广。

红黑树的特性

1.每个节点或者是黑色,或者红色。
2.根节点必须是黑色。
3.如果一个节点是红色的,则它的子节点必须是黑色的。
4.红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色)。
5.对于任一节点而言,其到每个叶子结点的每一条路径都包含数量相同的黑结点。
6.新添加的节点总是红色的。

        以上红黑树的特性一定要记住,因为在下面的代码分析过程中,会经常发现插入,删除节点后出现跟以上特性冲突的情况,这时候就需要进行修复。一般都是针对3 4 5点特性进行修复

 //通过比较器 找到查找方向!!!
  final Entry<K,V> getEntry(Object key) {
        // Offload comparator-based version for sake of performance
        //如果Comparator<? super K> comparator不为null 通过compare(k, p.key)方法比较
        if (comparator != null)
            return getEntryUsingComparator(key);
        if (key == null)
            throw new NullPointerException();
        //如果创建map么有指定comparator 也没有实现Comparable接口 在此处会报java.lang.ClassCastException异常
        Comparable<? super K> k = (Comparable<? super K>) key;
        Entry<K,V> p = root;
        while (p != null) {
            //否则使用compareTo 方法比较
            int cmp = k.compareTo(p.key);
            if (cmp < 0)
                p = p.left;
            else if (cmp > 0)
                p = p.right;
            else
                return p;
        }
        return null;
    }

 

©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值