如何实现按层级扁平化动态层次树并限制遍历深度与返回数量
解决方案
核心思路
你当前使用的是深度优先遍历(DFS),会优先遍历单个分支的最深节点,不符合按层级输出的要求。改为**广度优先遍历(BFS,层序遍历)**即可实现需求:用队列存储待处理的节点及对应深度,逐层处理子节点,保证输出顺序严格按照层级从浅到深。同时保留LinkedHashSet做去重,避免循环引用问题。
修改后代码
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; import java.util.AbstractMap; import java.util.LinkedHashSet; import java.util.Queue; import java.util.LinkedList; import java.util.Map; import java.util.Set; @GET @Path("/GetDatas") public Response getDatas(@QueryParam("clientId") final String clientId, @QueryParam("maxDepth") final Integer maxDepth, @QueryParam("limit") final Integer limit) { // 保留LinkedHashSet:保证插入顺序符合层级要求+自动去重防循环 Set<String> datas = new LinkedHashSet<>(); // 队列存储<节点ID, 当前深度>,根节点初始深度为0 Queue<Map.Entry<String, Integer>> queue = new LinkedList<>(); queue.add(new AbstractMap.SimpleEntry<>(clientId, 0)); while (!queue.isEmpty() && datas.size() < limit) { Map.Entry<String, Integer> current = queue.poll(); String currentId = current.getKey(); Integer currentDepth = current.getValue(); // 已达最大深度,不再遍历子节点 if (currentDepth >= maxDepth) { continue; } // 替换为你实际的REST接口调用逻辑获取当前节点的子节点 Set<String> results = function(currentId); for (String child : results) { // 达到条数限制直接终止 if (datas.size() >= limit) { break; } // 已存在的节点直接跳过,避免循环引用 if (!datas.contains(child)) { datas.add(child); // 子节点深度为当前深度+1,加入队列待后续处理 queue.add(new AbstractMap.SimpleEntry<>(child, currentDepth + 1)); } } } return Response.status(Response.Status.OK).entity(datas).build(); }
逻辑验证
完全匹配你给出的示例要求:
- 深度设为100、限制100条时:输出顺序为
2 3 4 5 6 7 8 9 - 深度为1、限制100条时:仅输出第一层子节点
2 3 - 深度为2、限制5条时:输出前5个节点
2 3 4 5 6
内容的提问来源于stack exchange,提问作者Leamas
相关产品推荐
相关产品推荐

