深度优先遍历是图的一种遍历方式,当然也可以用在对树的遍历,类似于树的先序遍历,是先序遍历的推广
深度优先遍历思想:
1.使用图的邻接矩阵的存储方式来存储图中每个节点之间的对应关系
2.使用一个标记数组来标记图中的节点是否被访问过
3.判断节点之间是否有联系
4.若有联系,比如i j 之间的有联系,就递归的再次访问 j 节点是否跟其他节点之间有关系
5.重复 3 4 步骤
深度优先遍历算法:
//深度优先搜索和广度优先搜索 //使用图中邻接矩阵的存储结构来存储 public class img { //存储结点的信息 private char[] imgMessage; //用来存储结点之间的对应关系 private int[][] imgRelative; //用来存储是否已经被访问过了 private boolean[] isFlag; //设置节点的信息 public void setImgMessage(char[] imgMessage){ this.imgMessage = imgMessage; } //初始化节点之间的关系,初始化放在构造方法中 public img(int n){ imgMessage = new char[n]; imgRelative = new int[n][n]; isFlag = new boolean[n]; //初始化节点之间的关系 for(int i = 0;i<n;i++){ for (int j = 0;j<n;j++){ imgRelative[i][j] = 0; } //初始化节点是否被访问 isFlag[i] = false; } } //设置节点之间的关系 public void setPointRelative(int i,int j){ //如果i == j那么不需要设置,因为已经初始化为0了 if(i == j){ return; } //设置节点之间的节点关系为连接状态 imgRelative[i][j] = 1; imgRelative[j][i] = 1; } //从某个节点开始进行深度优先遍历 public void DFSFromPoint(int i){ //将该节点标记为已访问 isFlag[i] = true; //将访问到的信息输出 System.out.println(imgMessage[i]); //判断该节点与其他节点之间的关系 for(int j = 0;j < imgMessage.length;j++){ if(imgRelative[i][j] == 1&&isFlag[j] == false){ //向下遍历j节点 DFSFromPoint(j); } } } //对图中的信息进行深度优先遍历 public void DFS(){ for(int i = 0;i<imgMessage.length;i++){ if(isFlag[i] == false){ DFSFromPoint(i); } } } public static void main(String a[]){ img img = new img(8); char[] message = {'1','2','3','4','5','6','7','8'}; img.setImgMessage(message); img.setPointRelative(0, 1); img.setPointRelative(0, 2); img.setPointRelative(1, 3); img.setPointRelative(1, 4); img.setPointRelative(3, 7); img.setPointRelative(4, 7); img.setPointRelative(2, 5); img.setPointRelative(2, 6); img.setPointRelative(5, 6); System.out.println("深度优先遍历结果:"); img.DFS(); } }