
HashMap 默认不支持同一键对应多个值,但通过将值类型设为 List,可高效建模树形关系,解决重复键覆盖问题,并正确填充邻接矩阵。
hashmap 默认不支持同一键对应多个值,但通过将值类型设为 `list
在构建树形结构(如父子关系映射)时,若直接使用 Map<integer integer></integer> 存储节点与其子节点,会因 HashMap 的“键唯一性”特性导致后插入的子节点覆盖前一个——例如 put(1, 2) 和 put(1, 9) 最终仅保留 1 → 9,丢失关键关系。
✅ 正确做法是:使用 Map<integer list>></integer>,其中每个键代表父节点,对应值为该节点所有子节点的列表。这既符合树的多叉语义,又天然支持动态增删子节点。
以下是优化后的完整实现:
Map<integer list>> treeMap = new HashMap(); // 初始化父节点并添加子节点 treeMap.put(1, new ArrayList()); treeMap.get(1).add(2); treeMap.get(1).add(9); // 现在 1 同时拥有子节点 2 和 9 treeMap.put(2, new ArrayList()); treeMap.get(2).add(3); treeMap.put(7, new ArrayList()); treeMap.get(7).add(8);</integer>
接着构建 10×10 邻接矩阵(行索引为父节点,列索引为子节点,值为 1 表示存在边):
int[][] matrix = new int[10][10];
for (int parent = 1; parent children = treeMap.get(parent);
if (children != null) {
for (int child : children) {
if (parent >= 1 && parent = 1 && child <p>? <strong>关键注意事项:</strong> </p>
- 始终先
put(key, new ArrayList())再get(key).add(value),或使用computeIfAbsent简化写法:treeMap.computeIfAbsent(1, k -> new ArrayList()).add(2); treeMap.computeIfAbsent(1, k -> new ArrayList()).add(9);
- 循环遍历需匹配实际节点范围(如本例中节点为 1~10),避免
ArrayIndexOutOfBoundsException; - 若需频繁查询/修改子节点,可考虑封装为
TreeNode类或使用 Guava 的Multimap(如ArrayListMultimap.create())进一步提升可维护性。
这种设计不仅解决了原始的“重复键覆盖”问题,还为后续扩展(如深度优先遍历、路径查找、子树统计)奠定了清晰的数据基础。










