TreeMap的fixAfterInsertion方法调用流程

本文深入探讨了红黑树的旋转操作,包括左旋和右旋,以及如何通过这些操作来保持红黑树的平衡性质。详细讲解了在不同情况下,如何调整节点颜色和进行旋转,以确保树的红黑属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以当前对象为基准
父:当前节点父节点
父父:当前节点父节点的父节点
父左:当前节点父节点的左节点
父右:当前节点父节点的右节点
rotateRight:右旋
rotateLeft:左旋

按照程序逻辑

Created with Raphaël 2.2.0 开始 非空&非根&父红 父=父父左? 父父右红? 父变黑,父父右变黑, 父父变红,该节点=父父 本节点=父右? 该节点=父 rotateLeft(该节点) 父变黑,父父变红, rotateRight(父父) 父父左红? 父变黑,父父左变黑, 父父变红,该节点=父父 根变黑 结束 该节点=父左? 该节点=父, rotateRight(该节点) 父变黑,父父变红, rotateLeft(父父) yes no yes no yes no yes no yes no yes no

形象点说

Created with Raphaël 2.2.0 开始 不空&不是根&父红 父为左节点? 父父右红? 父变黑,父父右变黑, 父父变红,该节点=父父 本节点为右节点? 该节点=父 该节点左旋 父变黑,父父变红, 父父右旋 父父左红? 父变黑,父父左变黑, 父父变红,该节点=父父 根变黑 结束 该节点为左节点? 该节点=父, 该节点右旋 父变黑,父父变红, 父父左旋 yes no yes no yes no yes no yes no yes no
<think>好的,我现在需要回答用户关于Java TreeMap常用方法及示例的问题。首先,我得回忆一下TreeMap的基本概念和常用方法TreeMap是基于红黑树实现的,可以保证键的有序性,默认是自然排序,也可以通过Comparator自定义排序规则。用户提到了引用中的例子,说明他们可能对自定义排序比较感兴趣,所以应该涵盖这部分内容。 接下来,我需要整理常用的方法。比如构造方法,尤其是使用Comparator的例子。然后像put、get、remove这些基本操作。还有导航方法,如firstKey、lastKey、lowerKey、higherKey等,这些是TreeMap特有的,需要详细说明。可能还需要提到视图方法,比如keySet、entrySet,以及迭代方式。 要确保每个方法都有示例代码,并且符合用户提供的引用中的格式。例如,引用[1]和引用[2]展示了如何创建降序排序的TreeMap,所以在构造方法部分要给出类似的示例。另外,用户可能需要知道如何遍历TreeMap,所以迭代器的使用也是重点。 同时,需要检查是否有遗漏的重要方法,比如size、containsKey、containsValue等。不过用户可能更关注与排序和导航相关的方法,所以优先这些。另外,要提到线程不安全的问题,以及在使用自定义Comparator时的注意事项。 最后,根据用户之前的示例,生成相关问题。可能需要包括性能分析、排序优化、应用场景等,但要根据TreeMap的特点来调整,比如红黑树结构的影响、自定义排序的使用场景等。 现在需要组织内容,确保结构清晰,分点列出常用方法,每个方法有说明和代码示例。同时引用提供的参考资料,在合适的地方标注引用标识。还要注意使用中文,保持语言自然,避免使用Markdown格式,但用户这里允许使用代码块。需要确保代码正确,比如泛型的使用、Comparator的写法等。 可能需要先介绍TreeMap的基本概念,然后分常用方法、导航方法、视图方法等部分。每个部分下给出方法和示例。例如: 1. 构造方法:自然排序和自定义排序 2. 添加/获取元素:put, get 3. 删除元素:remove 4. 导航方法:firstKey, lastKey, lowerKey, higherKey, floorKey, ceilingKey 5. 视图方法:keySet, entrySet, values 6. 其他方法:size, containsKey, clear 在每个方法中插入示例代码,比如创建TreeMap时使用Comparator.reverseOrder(),或者自定义Comparator类。引用中的例子可以作为参考,比如引用[1]和引用[2]中的降序排序示例,需要在构造方法部分提到,并标注引用。 需要注意代码的正确性,例如Java的泛型语法,Comparator的导入,以及TreeMap的初始化方式。例如,在自定义Comparator时,可能需要创建一个实现了Comparator接口的类,或者在构造函数中传入Comparator.reverseOrder()。 另外,遍历entrySet的时候,使用Map.Entry的getKey和getValue方法,这也是需要展示的。 最后,生成的相关问题应该围绕TreeMap的特性,比如与HashMap的区别、性能优化、自定义排序的实现、应用场景等。 总结步骤: 1. 概述TreeMap 2. 分点介绍常用方法,每个方法配示例代码 3. 引用提供的资料中的例子,标注引用 4. 生成相关问题</think>### Java TreeMap常用方法及示例 #### 1. 基础特性 TreeMap是基于红黑树实现的有序键值对集合,支持自然排序或通过$Comparator$自定义排序[^1]。默认按键升序排列,插入/查询操作时间复杂度为$O(\log n)$。 #### 2. 常用方法及示例 ##### (1) 构造方法 **自然排序构造** ```java TreeMap<Integer, String> map = new TreeMap<>(); ``` **自定义排序构造** ```java // 降序排列(使用内置Comparator) TreeMap<Integer, String> map1 = new TreeMap<>(Comparator.reverseOrder()); // 自定义Comparator(按字符串长度排序) TreeMap<String, Integer> map2 = new TreeMap<>( (s1, s2) -> s1.length() - s2.length() ); ``` 引用示例中的降序实现方式[^1][^2]。 ##### (2) 添加/获取元素 - `put(K key, V value)` - `get(Object key)` ```java map.put(3, "Apple"); map.put(1, "Banana"); System.out.println(map.get(3)); // 输出: Apple ``` ##### (3) 删除元素 - `remove(Object key)` ```java map.remove(1); // 删除键为1的条目 ``` ##### (4) 导航方法 - `firstKey()` / `lastKey()` ```java System.out.println(map.firstKey()); // 输出最小键 System.out.println(map.lastKey()); // 输出最大键 ``` - `lowerKey(K key)` / `higherKey(K key)` ```java // 小于给定键的最大键 Integer lower = map.lowerKey(3); // 大于给定键的最小键 Integer higher = map.higherKey(3); ``` - `floorEntry(K key)` / `ceilingEntry(K key)` ```java // 小于等于键的条目 Map.Entry<Integer, String> floor = map.floorEntry(2); // 大于等于键的条目 Map.Entry<Integer, String> ceiling = map.ceilingEntry(2); ``` ##### (5) 视图方法 - `keySet()` / `entrySet()` ```java // 遍历键 for (Integer key : map.keySet()) { System.out.println(key); } // 遍历键值对 for (Map.Entry<Integer, String> entry : map.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } ``` ##### (6) 其他方法 - `size()` ```java System.out.println(map.size()); // 输出当前元素数量 ``` - `containsKey(Object key)` ```java if (map.containsKey(5)) { System.out.println("包含键5"); } ``` #### 3. 注意事项 - **线程不安全**:需自行处理同步 - **自定义Comparator**:需确保与键的`equals()`逻辑一致 - **空值支持**:键不能为null(值可为null)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖工-->攻城狮

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值