说完广度优先搜索后,我们来看图的另一种遍历形式,深度优先搜索算法,深度优先总是对刚发现的节点的出阿发边进行探索,直到该节点的所有出发边都被发现为止。一旦所有的出发边都被发现,搜索就回溯到前驱结点,来搜索前驱结点的出发边。反复进行直到全部遍历。我们用递归跟栈两种方式进行实现,其实归根到底递归也是栈实现的。
递归实现:
public class DFS {
private boolean[] visited;
public void dfs(int[][]map){
visited=new boolean[map.length];
for (int i = 0; i < visited.length; i++) {
if (!visited[i]) {
core(map, i);
}
}
}
public void core(int[][]map,int node){
System.out.println(node);
visited[node]=true;
for (int i = 0; i < visited.length; i++) {
if (map[node][i]==1&&!visited[i]) {
core(map,i);
}
}
}
}
栈实现:
private LinkedList list=new LinkedList();
private boolean[] visited;
public void dfs(int[][] map){
visited=new boolean[map.length];
for (int i = 0; i < visited.length; i++) {
if (!visited[i]) {
list.addLast(i);
while (!list.isEmpty()) {
int now=(Integer) list.getLast();
visited[now]=true;
System.out.println(now);
int link=getlink(map, now);
if (link!=-1) {
list.add(link);
}else {
list.removeLast();
}
}
}
}
}
public int getlink(int[][]map,int node){
for (int i = 0; i < map.length; i++) {
if (map[node][i]==1&&!visited[node]) {
return i;
}
}
return -1;
}
原文:http://www.cnblogs.com/lonelyxmas/p/3562002.html