深入浅出的分析 TreeMap

640?wx_fmt=jpeg

这是Java极客技术的第 223 篇原创文章

前面介绍了 Map 接口的实现类 LinkedHashMap,LinkedHashMap 存储的元素是有序的,可以保持元素的插入顺序,但不能对元素进行自动排序。在某些场景,如果在数据的存储过程中,能够自动对数据进行排序,将会极大提高编程效率。而 Map 接口有一个重要的实现类 TreeMap,TreeMap 可以实现存储元素的自动排序。

1. 摘要

在集合系列的第一章,咱们了解到,Map 的实现类有 HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、Hashtable、Properties 等等。

640?wx_fmt=png

本文主要从数据结构和算法层面,探讨 TreeMap 的实现。

2. 简介

Java TreeMap 实现了 SortedMap 接口,也就是说会按照 key 的大小顺序对 Map 中的元素进行排序,key 大小的评判可以通过其本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Comparator)。

TreeMap 底层通过红黑树(Red-Black tree)实现,所以要了解 TreeMap 就必须对红黑树有一定的了解,在《集合系列》文章中,如果你已经读过红黑树的讲解,其实本文要讲解的 TreeMap,跟其大同小异。

红黑树又称红-黑二叉树,它首先是一颗二叉树,它具有二叉树所有的特性。同时红黑树更是一颗自平衡的排序二叉树。

640?wx_fmt=png

对于一棵有效的红黑树二叉树,主要有以下规则:

  • 每个节点要么是红色,要么是黑色,但根节点永远是黑色的;

  • 每个红色节点的两个子节点一定都是黑色;

  • 红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色);

  • 从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点;

  • 所有的叶节点都是是黑色的(注意这里说叶子节点其实是上图中的 NIL 节点);

这些约束强制了红黑树的关键性质:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这棵树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。所以红黑树它是复杂而高效的,其检索效率为O(log n)。下图为一颗典型的红黑二叉树。

640?wx_fmt=png

在树的结构发生改变时(插入或者删除操作),往往会破坏上述规则3或4,需要通过调整使得查找树重新满足红黑树的条件。

调整方式主要有:左旋、右旋和颜色转换!

左旋

左旋的过程是将 x 的右子树绕 x 逆时针旋转,使得 x 的右子树成为 x 的父亲,同时修改相关节点的引用。旋转之后,二叉查找树的属性仍然满足。

640?wx_fmt=png

右旋

右旋的过程是将 x 的左子树绕 x 顺时针旋转,使得 x 的左子树成为 x 的父亲,同时修改相关节点的引用。旋转之后,二叉查找树的属性仍然满足。

640?wx_fmt=png

颜色转换

颜色转换的过程是将红色节点转换为黑色节点,或者将黑色节点转换为红色节点,以满足红黑树二叉树的规则!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值