图,深度,广度优先遍历(二)
深度优先搜索树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); } } }