TreeMap使用红黑树来存储数据,红黑树是一种平衡二叉查找树,它是一种高效的搜索算法,它的算法时间复杂度是O(lgn),本文不涉及红黑树的定义及操作细节,只涉及部分有助于理解TreeMap的内容。本文旨在从整体上理解TreeMap工作原理,不深入细节。 为了保持简洁凸出重点,本文的示例图中树的结点只显示键(key)不显示值(value)。

二叉查找树

二叉查找树是常用的搜索类算法,它有三个特点:

  • 它是一颗二叉树,即每个节点都有两个子节点left、right
  • 每个节点的左节点键值小于等于当前节点键值
  • 每个节点的右节点键值大于等于当前节点键值

下面是一颗普通二叉查找树示例,树节点存储了键值对,

从上图可以看出,每个节点大于或等于左节点,小于或等于右节点。二叉搜索树的时间复杂度为O(h),h表示一颗树的高度,高度是一颗树的最长路径,上图中的树高度为5。普通二叉查找树最坏情况下的时间复杂度为O(n),n为存储的数据量。当n个有序的数据插入到普通二叉查找树时,它会变成一个链表,也可以称之为高度为n的二叉树。如下图所示:

红黑树也是一种二叉查找树,它避免了普通二叉查找树最坏情况的发生,每次往红黑树插入数据都会触发一顿操作,使二叉树变得平衡,平衡指一个结点的左子树和右子树的高度差的绝对值不超过1。平衡二叉树的高度为lgn,所以红黑树的时间复杂度为O(lgn),它比普通二叉查找树查找效率高一些。这也是TreeMap选用红黑树的原因。插入一组有序数据时红黑树示例图如下:

从上图可以看到,相比普通的二叉查找树,向红黑树插入一组有序的数据后树保持平衡。

对TreeMap的增删改查事实上就是对一颗红黑树增删改查,所以理解了红黑树就理解了TreeMap,如果想研究TreeMap的实现则需要学习红黑树的实现,本文不会深入到红黑树实现细节,对于理解TreeMap的原理只需知道二叉查找树就足够了。

查找

根据二叉查找树的性质,一个结点的左结点小于或者等于当前节点,一个结点的右节点大于或者等于当前节点,按照这个性质就从根结点一直往下查找就能找到结点。下图是一个查找示例图:

插入

插入分两个步骤,第一步根据二叉查找树的性质插入结点,第二步为红黑树性质保持,使树平衡。下面是插入示例图:

删除

红黑树删除结点比较复杂,本文只举一个简单的例子:

最后

在算法时间复杂度方面,HashMap要优于TreeMap,即使在最坏情况下HashMap也是一个红黑树数组,HashMap唯一的缺点是扩容操作可能会影响性能,在创建HashMap时指定一个合适的容量可以减少不必要的扩容操作。TreeMap的优点是可以顺序遍历元素。只有需要顺序遍历元素时才使用TreeMap否则使用HasnMap。

 


【水煮Java】