Java中TreeMap使用的数据结构及工作原理

水煮Java 专栏收录该内容
27 篇文章 1 订阅

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】
  • 1
    点赞
  • 0
    评论
  • 3
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论
请先登录 后发表评论~
©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

烧水匠

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值