数据结构图Graph之广度优先遍历

Posted by Naah on Thursday, Aug 17,2017 11:20:16

广度优先遍历,也称为广度优先搜索。简称BFS

类似于二叉树的层序遍历

  1. 算法准备

    a. 记录是否遍历过的数组

    b. 邻接点的队列

  2. 算法思路(递归)

    a. 从某顶点开始

    b. 将该顶点记录,并输出值

    c. For循环查找该顶点的邻接点。将邻接点下标添加到队列中

    d. while循环,循环条件为队列不为空

    e. 移出队首顶点下标

    f. 如果没访问过则递归该邻接点

public class Graph> {

	// 顶点数组
	private T[] vertexs;

	// 邻接表元素数组
	private VertexNeighborNode[] neighborArray;

	// 邻接矩阵
	private int[][] matrix;

	// 泛型对象的类文件
	private Class Class;

	// 顶点数量
	private int size;


/**
 * 广度优先遍历方法(递归)
 */
public void bredthFirst() {
	// 建立记录数组
	boolean[] isVisited = new boolean[size];

	// 创建队列
	LinkedList queue = new LinkedList();

	// 广度优先遍历方法实现,从第一个开始
	bredthFirst(isVisited, queue, 0);

}

/**
 * 广度优先算法遍历方法实现
 * @param isVisited 记录数组
 * @param queue 队列
 * @param i 开始顶点
 */
private void bredthFirst(boolean[] isVisited, LinkedList queue,
		int i) {

	// 将当前顶点设置为已遍历
	isVisited[i] = true;
	System.out.println("第" + i + "个顶点被访问了:" + vertexs[i]);

	// 循环将该顶点的出度顶点下标添加到队列中
	for (int j = 0; j < size; j++) {

		// 出度顶点判断,不为自己 并且 相连 并且没有访问过
		if (matrix[i][j] != 0 && matrix[i][j] != NO_LINK && !isVisited[j]) {

			// 添加到队列
			queue.offer(j);
		}
	}

	// 如果队列不为空则循环
	while (!queue.isEmpty()) {

		// 将顶点下标从队首弹出
		int weight = queue.poll();

		// 如果该顶点没访问过
		if (!isVisited[weight]) {

			// 递归广度遍历该方法
			bredthFirst(isVisited, queue, weight);
		}
	}

}
}