广度优先搜索树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); }