面试题答案
一键面试1. TreeMap保证有序性基于的数据结构和算法原理
- 数据结构:TreeMap 基于红黑树(Red-Black Tree)这种自平衡二叉查找树来实现。红黑树具有以下特性:
- 每个节点要么是红色,要么是黑色。
- 根节点是黑色。
- 每个叶节点(NIL节点,空节点)是黑色的。
- 如果一个节点是红色的,则它的两个子节点都是黑色的。
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
- 算法原理:红黑树作为二叉查找树,其左子树上所有节点的值均小于根节点的值,右子树上所有节点的值均大于根节点的值。在插入、删除操作后,通过旋转(左旋、右旋)和变色操作来保持红黑树的特性,从而维持树的平衡,保证插入、删除、查找操作的时间复杂度为 O(log n)。在 TreeMap 中,利用红黑树的这种结构特性来保证键的有序性,即按照键的自然顺序(实现了
Comparable
接口)或者自定义顺序(通过Comparator
接口)进行排序。
2. 插入新元素时TreeMap维护有序性的过程
假设我们有如下代码示例:
import java.util.TreeMap;
public class TreeMapExample {
public static void main(String[] args) {
TreeMap<Integer, String> treeMap = new TreeMap<>();
treeMap.put(3, "Three");
treeMap.put(1, "One");
treeMap.put(2, "Two");
}
}
- 初始插入:
- 当插入第一个键值对
(3, "Three")
时,红黑树为空,此时创建一个新节点,该节点为黑色(根节点默认为黑色)。
- 当插入第一个键值对
- 后续插入:
- 插入
(1, "One")
时,比较 1 和 3,因为 1 < 3,所以 1 被插入到 3 的左子节点位置。 - 插入
(2, "Two")
时,比较 2 和 3,2 < 3,继续比较 2 和 1,2 > 1,所以 2 被插入到 1 的右子节点位置。
- 插入
- 维护平衡:
- 插入节点后,可能会破坏红黑树的特性。例如,如果插入操作导致出现两个连续的红色节点(违反特性4),就需要进行旋转和变色操作来恢复平衡。比如在某些插入场景下,可能需要左旋、右旋操作来调整树的结构,同时对节点颜色进行改变,以保证红黑树的所有特性仍然满足,从而维持键的有序性。在上述简单示例中,插入这几个节点暂时未破坏红黑树特性,若插入更多节点,当出现不平衡情况时,就会触发相应调整操作。