我在这个主题上看到了类似的问题,但没有一个真正帮助我掌握解决这个问题的步骤。
给定一个队列和一个rootNode,我该如何迭代它?我首先理解我必须将我开始的节点排队,但我对如何实现next()方法感到困惑。它也必须是广度优先遍历。
对于next()方法,我有这个:
public File next(){
while(the peek() is a directory ("parent"){
use lists() to return the array of files
iterate thru those and add to queue
remove the first node
}
return peek();
如果我有一个文件目录似乎有效。 此外,我正在寻找一个pseucode而不是代码。我对于我是否走在正确的道路上感到困惑。
答案 0 :(得分:0)
如果出于某种原因,你坚持使用非递归解决方案,虽然FileVisitor绝对是Java中的方法,但广泛的第一次搜索可以非递归地实现。
这是一般性定义,标记用于避免循环引用,尽管在这种情况下你不会有这种情况:
为了获得所需的孩子:String[] directories = file.list()
。
确保排队目录而不是文件
调用file.isDirectory()
并仅将目录排入队列。
在排队之前不需要进行标记,因为在目录之间不会有循环引用。
编辑:
这是递归广度优先搜索,您可以使用上面的伪代码将其修改为迭代。
import java.io.File;
import java.util.LinkedList;
import java.util.Queue;
public class BFSRecursive {
public static void main(String[] args) {
File file = new File("D:/Tomcat");
Queue<File> files = new LinkedList<>();
files.add(file);
bfs(files);
}
private static void bfs(Queue<File> files) {
if (files.isEmpty())
return;
File file = files.poll();
System.out.println(file.getName());
String[] directories = file.list();
for(String child: directories) {
File childFile = new File(file.getAbsolutePath() +"/"+ child);
if (childFile.isDirectory())
files.add(childFile);
}
bfs(files);
}
}