如何从Map中获取指定父节点的所有层级子节点?去重问题求助
解决递归获取所有父节点的重复问题
原代码的问题出在递归逻辑混乱,导致节点被重复添加,还错误地把目标节点本身也放进了结果里。具体问题点:
- 递归调用后既添加返回的子列表,又手动添加当前父节点,同一节点被多次插入
- 最后把目标节点(比如
fc)也加入了结果,不符合“获取所有父节点”的需求 - 终止条件返回空列表,会让上层无意义地添加空集合
下面是修正后的代码,同时加入去重逻辑(避免循环依赖或重复路径导致的重复节点):
import java.util.*; public class ParentResolver { public static Map<String, List<String>> childParentMap = new HashMap<>(); public static List<String> immediateParents(String key) { return childParentMap.getOrDefault(key, Collections.emptyList()); } public static List<String> getAllParents(String key) { // 使用LinkedHashSet保证顺序且去重 Set<String> parentSet = new LinkedHashSet<>(); collectAllParents(key, parentSet); return new ArrayList<>(parentSet); } private static void collectAllParents(String key, Set<String> parentSet) { List<String> immediateParents = childParentMap.get(key); if (immediateParents == null || immediateParents.isEmpty()) { return; } for (String parent : immediateParents) { // 先递归处理上层父节点,再添加当前父节点,保证顺序是[m, n, x, y] collectAllParents(parent, parentSet); parentSet.add(parent); } } public static void main(String[] args) { childParentMap.put("fc", Arrays.asList("x", "y")); childParentMap.put("x", Arrays.asList("m", "n")); String key = "fc"; List<String> res = getAllParents(key); System.out.println(res); // 输出 [m, n, x, y] } }
修改说明:
- 拆分递归逻辑:用私有方法
collectAllParents负责递归收集,主方法getAllParents初始化去重集合,避免原方法中参数传递列表导致的混乱 - 使用
LinkedHashSet:既保证节点的添加顺序,又自动去重,彻底解决重复问题 - 移除目标节点的添加操作:结果只包含所有层级的父节点
- 调整递归顺序:先递归处理上层父节点,再添加当前父节点,严格符合需求的
[m, n, x, y]顺序 - 优化终止条件:没有父节点时直接返回,不做多余操作
内容的提问来源于stack exchange,提问作者man123
相关产品推荐
相关产品推荐

