图,深度,广度优先遍历(三)
广度优先搜索树BFS
算法(队列实现):
同深度优先搜索,需要一个ArrayList<Integer> searchOrders存放路径;
一个int[]数组parent存放父亲节点;
一个boolean[]数组isVisited标记节点是否被访问过;
另外,不同于深度优先搜索,前文中深度优先搜索是以递归形式来实现(其实用栈亦可以实现),广度优先搜索用
队列实现,所以需要一个链表LinkedList<Integer> queue存放处理节点的优先顺序;
step1 将起始节点v放入队列,queue.offer(v),并且isVisited[v] = true;
step2 队列不为空的情况下,循环:
队首节点u出列 int u = queue.poll();
将队首节点u加入searchOrders, searchOrders.add(u);
将所有相邻节点进行处理,若该相邻节点未被访问过,则:
1.父亲数组parent进行赋值为u;
2.将相邻节点放入队列queue;
3.访问标记isVisited = true;
代码:
public Tree bfs(int v) {
boolean[] isVisited = new boolean[vertices.size()];
int[] parent = new int[vertices.size()];
List<Integer> searchOrders =new ArrayList<Integer>();
for (int i = 0; i < parent.length; i++)
parent[i] = -1;
java.util.LinkedList<Integer> queue = new java.util.LinkedList<Integer>();
queue.offer(v);
isVisited[v] = true;
while (!queue.isEmpty()) {
int u = queue.poll();
searchOrders.add(u);
for (int w:neighbours.get(u)) {
if (!isVisited[w]) {
parent[w] = u;
queue.offer(w);
isVisited[w] = true;
}
}
}
return new Tree(v,parent,searchOrders);
}
浙公网安备 33010602011771号