在不使用二叉树或递归的情况下迭代文件系统

时间:2015-06-12 18:52:58

标签: java queue

我在这个主题上看到了类似的问题,但没有一个真正帮助我掌握解决这个问题的步骤。

给定一个队列和一个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而不是代码。我对于我是否走在正确的道路上感到困惑。

1 个答案:

答案 0 :(得分:0)

如果出于某种原因,你坚持使用非递归解决方案,虽然FileVisitor绝对是Java中的方法,但广泛的第一次搜索可以非递归地实现。

这是一般性定义,标记用于避免循环引用,尽管在这种情况下你不会有这种情况:

  • 将目录的根目录排队并将root标记为已发现
  • 虽然队列不为空
  • 出列并处理元素
  • 发现相邻的边缘 - 儿童
  • 为每个孩子,如果没有标记,并且是目录,标记和队列

为了获得所需的孩子: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);
  }
}