深度优先搜索树DFS
算法:step1 选取图中的一个点(Vertex) v,将与该点v相邻的其余所有点存放至neighbours.get(v)中。
isVisited数组用来判断该点是否已遍历,isVisited[v] = true;
step2 递归方法
dfs(v,parent,serachOrders);
parent为int[]数组,parent[i]表示i点的父亲节点。
searchOrders为一个ArrayList<Integer>数组,为遍历路径。
每次递归开始,searchOrders.add(v),isVisited[v] = true;
将v所有相邻节点i进行判断,若未被访问过,即!isVisited[i],则其父亲点parent[i] = v;
递归dfs(i,parent,searchOrders);
代码:
public Tree dfs(int v) {
List<Integer> searchOrders = new ArrayList<Integer>();
int[] parent = new int[vertices.size()];
for (int i = 0; i < parent.length; i++)
parent[i] = -1; // init parent array;
boolean[] isVisited = new boolean[vertices.size()];
dfs(v, parent, searchOrders, isVisited);
return new Tree(v,parent,searchOrders);
}
private void dfs(int v, int[] parent, List<Integer> searchOrders, boolean[] isVisited) {
searchOrders.add(v);
isVisited[v] = true;
for (int i:neighbours.get(v)) {
if (!isVisited[i]) {
parent[i] = v;
dfs(i,parent,searchOrders,isVisited);
}
}
}