目录

一、DFS深度优先算法

二、DFS实例:对文件夹的遍历

1、首先编写FileTree类

2、编写FileToTree类实现算法

 1、实现代码:

 2、输出方法实现

 3、输出结果

三、完整实现代码:


一、DFS深度优先算法

DFS即DEPTH FIRST SERVE,即从树的根节点开始遍历,从其中一个子节点开始持续向下遍历每一个节点,直至到叶子节点则返回上一级,最后回到根节点下的子节点继续往复遍历。

  如下图:

DFA java 算法 java中dfs_算法

 根据DFS算法则遍历顺序为:1>2>5>10>6>3>7>4>8>9

二、DFS实例:对文件夹的遍历

递归来实现,即当遍历的文件夹为空时返回,实现自己调用自己。

1、首先编写FileTree类

方便对于后续的文件的遍历,不懂的可以看注释!

或者私信我哦!!

package FileTree_Test;
import java.util.List;
public class FileTree {
    private List<FileTree> children;
    private String filename;
    private Boolean IsDirectory;
    public Boolean getIsDirectory()
    {
       return IsDirectory;
    }//获取存储是否是文件夹结果
    public   void setIsDirectory(Boolean Judge)
    {
        this.IsDirectory=Judge;
    }//存储是否是文件夹的结果
    public FileTree(String filename){
        this.filename=filename;
    }
    public String getFilename() {
        return filename;
    }//获取文件名
    public void setFilename(String filename) {
        this.filename = filename;
    }
    public List<FileTree> getChildren() {
        return children;
    }//存储文件夹的子文件
    public void setChildren(List<FileTree> children) {
        this.children = children;
    }//设为子文件列表
    public void addchild(FileTree fileTree){
        children.add(fileTree);
    }//添加子文件
    public boolean islast(){
        return children==null;
    }//是否是最后的叶子节点(文件)
}

2、编写FileToTree类实现算法

  • 需要用到的方法:
  • File. listFiles() //存储该文件下所有子文件
  • File.isDirectory() //判断是否为文件夹

 实现思路:首先遍历根文件,判断是否是文件夹,如果是就使用一个File数组来存储通过listFiles方法获取的文件,然后再遍历File数组中的子文件夹,并且再加上根目录路径,再添加到此级的子文件数组中,最后使用遍历完成。

  输出则是一级一级的遍历输出

 1、实现代码:

public static void FileToTree_DFS(FileTree root){//DFS
            File rootfile=new File(root.getFilename());
            if(!rootfile.isDirectory()){//不是文件夹设为false
                    root.setIsDirectory(false);
                return;
            }else{
                root.setIsDirectory(true);
                File []children=rootfile.listFiles();//将根目录下的子文件顺序放置在一个文件数组中
                for(File child:children){
                    FileTree childtree=new FileTree(root.getFilename()+"\\"+child.getName());
                    if(root.getChildren()==null)
                        root.setChildren(new ArrayList<FileTree>());
                    root.addchild(childtree);//将Line18的匿名孩子对象添加到根目录的孩子中
                    FileToTree_DFS(childtree);//递归
                }
            }
        }

 2、输出方法实现

public static void printfFile(FileTree fileTree){
            List<FileTree> list = fileTree.getChildren();
            if (fileTree.islast())
            {
//                空语句
            }
            else {//不为空则继续遍历
                System.out.println(fileTree.getFilename()+" "+fileTree.getIsDirectory());
                for (FileTree FileTree : list) {
                    System.out.println(FileTree.getFilename()+" "+FileTree.getIsDirectory());
                }
                System.out.println("======================================");
                for (FileTree FileTree : list) {
                    printfFile(FileTree);
                }
            }
        }

 3、输出结果

DFA java 算法 java中dfs_算法_02

DFA java 算法 java中dfs_算法_03

 

DFA java 算法 java中dfs_DFA java 算法_04

 

三、完整实现代码:

Tips:需要另先创建FileTree类!

import java.util.List;
import java.io.File;
import java.util.ArrayList;

public class FileTo_Tree {
        public static void FileToTree_DFS(FileTree root){//DFS
            File rootfile=new File(root.getFilename());
            if(!rootfile.isDirectory()){//不是文件夹设为false
                    root.setIsDirectory(false);
                return;
            }else{
                root.setIsDirectory(true);
                File []children=rootfile.listFiles();//将根目录下的子文件顺序放置在一个文件数组中
                for(File child:children){
                    FileTree childtree=new FileTree(root.getFilename()+"\\"+child.getName());
                    if(root.getChildren()==null)
                        root.setChildren(new ArrayList<FileTree>());
                    root.addchild(childtree);//将Line18的匿名孩子对象添加到根目录的孩子中
                    FileToTree_DFS(childtree);//递归
                }
            }
        }

 public static void printfFile(FileTree fileTree){
            List<FileTree> list = fileTree.getChildren();
            if (fileTree.islast())
            {
//                空语句
            }
            else {//不为空则继续遍历
                System.out.println(fileTree.getFilename()+" "+fileTree.getIsDirectory());
                for (FileTree FileTree : list) {
                    System.out.println(FileTree.getFilename()+" "+FileTree.getIsDirectory());
                }
                System.out.println("======================================");
                for (FileTree FileTree : list) {
                    printfFile(FileTree);
                }
            }
        }

 public static void main(String[] args) {
            FileTree root=new FileTree("D:\\RootFile");
     //FileToTree_DFS(root);
           FileToTree_BFS(root);
            printfFile(root);
        }
}