利用递归查找指定名称的父目录问题(含代码片段)
递归实现按目录名查找父目录的完整方案
我来帮你完善这个递归查找父目录的功能,结合你的需求(用ArrayList表示目录结构、未知目标深度、目标必定存在),我会给出完整的可运行代码并拆解关键逻辑:
第一步:定义Directory类结构
首先我们需要补全目录类的基础结构,包含名称和子目录集合:
import java.util.ArrayList; class Directory { private String name; private ArrayList<Directory> children; public Directory(String name) { this.name = name; this.children = new ArrayList<>(); } // Getter方法,供递归方法访问目录信息 public String getName() { return name; } public ArrayList<Directory> getChildren() { return children; } // 辅助方法:添加子目录,方便构建测试用的目录树 public void addChild(Directory child) { children.add(child); } }
第二步:实现递归查找方法
根据你的需求,递归方法的核心逻辑是遍历当前目录的子目录,找到目标目录后返回当前目录(即父目录);如果当前目录的子目录里没有目标,就递归遍历每个子目录的子树,把找到的结果向上传递。这里我保留了你代码里的level参数(用来记录遍历层级,可选):
public class DirectoryFinder { private static Directory getParentDirectory(String targetDirName, Directory currentDirectory, int level) { // 可选:打印当前遍历的层级和目录,方便调试 System.out.printf("遍历层级:%d,当前目录:%s%n", level, currentDirectory.getName()); // 遍历当前目录的所有子目录 for (Directory child : currentDirectory.getChildren()) { // 如果当前子目录就是我们要找的目标,返回当前目录(它的父目录) if (child.getName().equals(targetDirName)) { return currentDirectory; } // 递归查找子目录的子树 Directory foundParent = getParentDirectory(targetDirName, child, level + 1); // 如果递归找到了结果,直接向上返回,不用继续遍历其他子目录 if (foundParent != null) { return foundParent; } } // 题目说明目标必定存在,所以这个分支实际不会执行 return null; } // 测试用例 public static void main(String[] args) { // 构建一个示例目录树:根目录 -> 文档 -> 工作资料 -> 项目X Directory root = new Directory("根目录"); Directory docs = new Directory("文档"); Directory workFiles = new Directory("工作资料"); Directory projectX = new Directory("项目X"); root.addChild(docs); docs.addChild(workFiles); workFiles.addChild(projectX); // 查找"项目X"的父目录 Directory parent = getParentDirectory("项目X", root, 0); System.out.println("目标目录的父目录是:" + parent.getName()); // 输出:工作资料 } }
关键逻辑拆解
- 递归终止条件:当发现当前目录的某个子目录正好是目标目录时,直接返回当前目录(也就是目标的父目录)。
- 递归遍历逻辑:对每个子目录递归调用方法,如果递归返回了非null的结果,说明在子树里找到了目标,直接把结果向上传递,避免无效遍历。
- level参数的作用:如果不需要调试层级信息,可以直接去掉这个参数,简化方法签名为
getParentDirectory(String targetDirName, Directory currentDirectory)。 - 目标必定存在的保证:因为题目明确目标目录存在,所以最后返回null的分支不会被触发,无需处理找不到的异常情况。
内容的提问来源于stack exchange,提问作者omom007
相关产品推荐
相关产品推荐

