
本文介绍一种递归算法,将按层级关系组织的路径及其重复次数映射为深度优先、重复展开的嵌套序列,严格保持原始路径父子关系与重复逻辑。
本文介绍一种递归算法,将按层级关系组织的路径及其重复次数映射为深度优先、重复展开的嵌套序列,严格保持原始路径父子关系与重复逻辑。
在构建配置驱动的树形输出(如权限路径展开、模板渲染、测试用例生成等场景)时,常需将“路径 + 重复次数”的扁平映射(Map<path integer></path>)转化为符合嵌套语义的线性序列——即:每个父路径出现若干次,每次出现后立即递归展开其所有直接子路径,且子路径也按其自身重复次数完整展开;该过程需严格遵循深度优先顺序,并复现重复块。
核心思想是:对任一路径 p,先输出 p 共 m.get(p) 次;每次输出后,遍历所有以 p 为直接父级的子路径(即 child.getParent().equals(p)),并对每个子路径递归调用相同逻辑。
以下是简洁、可读性强的 Java 实现(基于 java.nio.file.Path):
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.LinkedHashMap;
import java.util.Map;
public class PathExpander {
public static void main(String[] args) {
Map<path integer> input = new LinkedHashMap();
input.put(Paths.get("/a"), 1);
input.put(Paths.get("/a/b"), 1);
input.put(Paths.get("/a/c"), 2);
input.put(Paths.get("/a/d"), 2);
input.put(Paths.get("/a/d/e"), 2);
input.put(Paths.get("/a/f"), 1);
input.put(Paths.get("/a/g"), 1);
printElement(Paths.get("/a"), input);
}
static void printElement(Path current, Map<path integer> mapping) {
int repetitions = mapping.get(current);
for (int i = 0; i entry.getKey().getParent() != null
&& entry.getKey().getParent().equals(current))
.forEach(entry -> printElement(entry.getKey(), mapping));
}
}
}</path></path>
✅ 输出效果(完全匹配题目要求):
/a /a/b /a/c /a/c /a/d /a/d/e /a/d/e /a/d /a/d/e /a/d/e /a/f /a/g
⚠️ 注意事项:
- 输入
Map必须为 有序映射(如LinkedHashMap),确保路径插入顺序与层级逻辑一致(尽管递归依赖父子关系而非插入序,但便于调试和可预测性); - 路径必须规范(无冗余
/、无相对路径陷阱),建议使用Paths.get()构造以保证getParent()行为可靠; - 该算法时间复杂度为 O(N × D)(N 为路径总数,D 为最大嵌套深度),空间复杂度为 O(D)(递归栈深度),适用于中等规模层级结构;
- 若需返回
List<string></string>而非打印,只需将System.out.println(...)替换为result.add(current.toString())并传入可变列表即可。
该方案不依赖外部库,逻辑清晰、易于扩展(如支持跳过某层、添加前置/后置钩子),是处理层级化重复展开问题的典型递归范式。










