图,深度,广度优先遍历(三)

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

 

posted on 2013-03-31 10:42  Jam_01  阅读(256)  评论(0编辑  收藏  举报

导航