dfs——练习demo1(20届周新杰提供)_搜索



深搜的遍历过程就是尽可能深的搜索树的分支,当一个节点的所有子节点都被探寻过了,搜索将回溯到发现该节点的那那条边的起始节点
这个过程会一直持续到已发现节点可到达所有节点为止。
如果还存在未发现的节点则进程会随便选择一个未发现的节点重复以上的过程
整个进程直到所有节点都被访问过为止。

深度优先搜索遍历过程
从a开始搜索可以看到a的子节点有c、d、f系统会依次对其进行深度优先搜索
进程先对c进行子节点的搜索可以看出c有两个子节点b、d
可以看出b没有子节点了,但是d节点作为c的子节点还没有被访问所有这个时候程序会走到d的位置
但是d也没有子节点这个时候进程会回溯到发现d的这条边的起始节点a的位置然后在对其进行搜索
a的子节点中只有f没有被遍历了所以进程只能进到f的位置然后在对其进行遍历可以看出f的两个子节点也没有子节点
所以进程在对g、e进行完遍历之后进程结束。


static String b[] = { "a", "b", "c", "d", "e", "f", "g" };
static int [][]arr= {
{0,0,1,1,0,1,0},
{0,0,1,0,0,0,0},
{1,1,0,1,0,0,0},
{1,0,1,0,0,0,0},
{0,0,0,0,0,0,1},
{1,0,0,0,0,0,1},
{0,0,0,0,1,1,0}
};


对此二维数组进行深度搜索与广度搜索,并遍历结果。


package test;

public class dfs {
// 构造图的边
private int[][] edges = {
{0,0,1,1,0,1,0},
{0,0,1,0,0,0,0},
{1,1,0,1,0,0,0},
{1,0,1,0,0,0,0},
{0,0,0,0,0,0,1},
{1,0,0,0,0,0,1},
{0,0,0,0,1,1,0}
};
// 构造图的顶点
private String[] vertexs = { "a", "b", "c", "d", "e", "f", "g" };
// 记录被访问顶点
private boolean[] verStatus;
// 顶点个数
private int vertexsNum = vertexs.length;

public void DFSTra() {
verStatus = new boolean[vertexsNum];
for (int i = 0; i < vertexsNum; i++) {
if (verStatus[i] == false) {
DFS(i);
}
}
}

// 递归深搜
private void DFS(int i) {
System.out.print(vertexs[i] + " ");
verStatus[i] = true;
// 深度搜索子节点
for (int j = firstAdjVex(i); j >= 0; j = nextAdjvex(i, j)) {
if (!verStatus[j]) {
DFS(j);
}
}
}

// 返回与i相连的第一个顶点
private int firstAdjVex(int i) {
for (int j = 0; j < vertexsNum; j++) {
if (edges[i][j] > 0) {
return j;
}
}
return -1;
}

// 返回与i相连的下一个顶点
private int nextAdjvex(int i, int k) {
for (int j = (k + 1); j < vertexsNum; j++) {
if (edges[i][j] == 1) {
return j;
}
}
return -1;
}

// 测试
public static void main(String[] args) {
new dfs().DFSTra();
}

}

深搜结果

a c b d f g e