news 2026/6/21 23:08:19

TreeMap与TreeSet的实现原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TreeMap与TreeSet的实现原理

JavaTreeMapTreeSet:基于红黑树的有序集合

TreeMapTreeSet是 Java 集合框架中的两种重要数据结构,它们都基于红黑树(Red-Black Tree)实现,提供了有序的元素存储和操作方式。TreeMap用于存储键值对(key-value),而TreeSet用于存储不重复的元素。它们的底层实现原理非常相似,但由于存储结构和用途的不同,具体实现也有所区别。

1. 红黑树数据结构的基础

红黑树概述

红黑树是一种自平衡的二叉查找树,具有以下特点:

  1. 每个节点要么是红色,要么是黑色。
  2. 根节点是黑色。
  3. 每个叶子节点(NIL 节点)是黑色。
  4. 如果一个红色节点的父节点是红色的,则违反红黑树规则,因此红色节点的子节点必须是黑色。
  5. 从根节点到每个叶子节点的路径上,黑色节点的数量必须相同。
  6. 红黑树的高度是平衡的,因此它的查找、插入和删除操作的时间复杂度为O(log n)

2.TreeMap的实现原理

TreeMap 基本结构

TreeMap实现了NavigableMap接口,而NavigableMap继承自SortedMapTreeMap的核心数据结构是一个红黑树。每个树节点包含一个键值对(key 和 value),并根据 key 进行排序。

TreeMap 插入过程

TreeMap中的插入操作通过红黑树实现,在插入新节点时会保持红黑树的平衡。插入的过程包括:

  1. 查找位置:根据 key 比较找到合适的位置。
  2. 插入节点:找到位置后创建新的节点,并插入到树中。
  3. 平衡调整:插入后调用fixAfterInsertion来确保红黑树的平衡性。
fixAfterInsertion:插入后平衡树
  1. 颜色调整:如果父节点是红色节点,需要进行颜色调整。
  2. 旋转调整:通过左旋或右旋来保持红黑树的平衡。

3.TreeSet的实现原理

TreeSetTreeMap非常相似,不同之处在于TreeSet不存储值,只存储键。内部结构使用TreeMap来实现,而TreeMap中的 key 就是TreeSet中的元素。

TreeSet 的实现

  • TreeSet底层通过TreeMap来存储元素,所有的操作(如添加、删除、查找等)都会通过TreeMap实现。
  • TreeMap存储元素的同时保证它们的有序性。

4. 查找与删除操作

查找操作

TreeMapTreeSet的查找操作都基于红黑树的查找方式。通过compare()方法来比较键值,查找时间复杂度是O(log n)

删除操作

删除操作需要先找到要删除的节点,然后通过旋转和颜色调整来保持红黑树的平衡。

示例代码:TreeMap的删除操作

java复制

public V remove(Object key) { Entry<K, V> p = getEntry(key); if (p == null) return null; deleteEntry(p); return p.value; } private void deleteEntry(Entry<K, V> p) { if (p.left != null && p.right != null) { Entry<K, V> s = successor(p); p.key = s.key; p.value = s.value; p = s; } Entry<K, V> replacement = (p.left != null ? p.left : p.right); if (replacement != null) { replacement.parent = p.parent; if (p.parent == null) root = replacement; else if (p == p.parent.left) p.parent.left = replacement; else p.parent.right = replacement; p.left = p.right = p.parent = null; } else if (p.parent == null) { root = null; } else { if (p == p.parent.left) p.parent.left = null; else p.parent.right = null; p.parent = null; } size--; modCount++; }

5. 总结

  • TreeMapTreeSet都基于红黑树实现,提供了高效的查找、插入和删除操作。
  • TreeMap存储键值对,TreeSet只存储键。
  • 插入和删除操作会触发红黑树的旋转和颜色调整,以保证树的平衡性。
  • TreeSetTreeMap的一个封装,利用TreeMap来实现元素的有序存储。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/21 6:13:39

YOLOv13镜像常见问题全解,新手必看

YOLOv13镜像常见问题全解&#xff0c;新手必看 你刚拉取了YOLOv13官版镜像&#xff0c;执行docker run启动容器&#xff0c;却卡在环境激活环节&#xff1f; 输入conda activate yolov13提示“command not found”&#xff0c;或者运行预测脚本时爆出ModuleNotFoundError: No …

作者头像 李华
网站建设 2026/6/13 1:15:07

实测分享:用Unsloth在单卡上高效训练Qwen-14B

实测分享&#xff1a;用Unsloth在单卡上高效训练Qwen-14B 1. 为什么这次实测值得你花5分钟读完 你是否也遇到过这样的困境&#xff1a;想微调一个14B级别的大模型&#xff0c;但手头只有一张3090或4090——显存告急、训练慢得像加载网页、改个参数要等半小时&#xff1f;我试…

作者头像 李华
网站建设 2026/6/21 12:42:35

Qwen-Image-2512-ComfyUI打造个性化头像,效果超赞

Qwen-Image-2512-ComfyUI打造个性化头像&#xff0c;效果超赞 你有没有试过花半小时修图、换背景、调光影&#xff0c;就为了发一条朋友圈&#xff1f;或者反复改简历头像&#xff0c;却总觉得不够专业、不够有辨识度&#xff1f;现在&#xff0c;用阿里最新开源的Qwen-Image-…

作者头像 李华
网站建设 2026/6/19 11:42:47

如何突破视觉识别模型性能瓶颈:解密VOLO实战应用指南

如何突破视觉识别模型性能瓶颈&#xff1a;解密VOLO实战应用指南 【免费下载链接】volo 项目地址: https://gitcode.com/gh_mirrors/volo/volo 副标题&#xff1a;基于Outlook Attention机制的图像分类解决方案 | 深度学习开发者效率提升手册 视觉识别技术作为计算机视…

作者头像 李华
网站建设 2026/6/18 0:24:53

cv_resnet18 vs DBNet性能对比:谁更适合中文文本检测?

cv_resnet18 vs DBNet性能对比&#xff1a;谁更适合中文文本检测&#xff1f; 在实际OCR项目落地中&#xff0c;模型选型往往比调参更关键——一个轻量但鲁棒的检测器&#xff0c;可能比参数调到极致的重型模型更实用。尤其面对中文场景&#xff1a;文字方向多变、字体样式繁杂…

作者头像 李华
网站建设 2026/6/15 14:19:27

Flux与Z-Image-Turbo性能对比:9步推理谁更快?部署实测数据

Flux与Z-Image-Turbo性能对比&#xff1a;9步推理谁更快&#xff1f;部署实测数据 1. 开箱即用的文生图高性能环境 你有没有试过等一个模型下载30多GB权重&#xff0c;结果显存还爆了&#xff1f;或者调好环境发现跑不动1024分辨率&#xff1f;这次我们直接跳过所有折腾环节—…

作者头像 李华