思想:类似对树形结构进行逐层的遍历,深度是先输出某个孩子的家族体系,然后是另一个孩子的家族体系,而广度是先输出所有的孩子。
如下图:第一张图是图结构,第二张为BFS输出
对这张图进行代码demo:
public static void main(String[] args) {
//图的邻接表
int[][] a = {
{0, 1, 1, 0, 0, 0, 0},
{1, 0, 0, 1, 0, 0, 1},
{1, 0, 0, 0, 0, 1, 1},
{0, 1, 0, 0, 1, 0, 0},
{0, 0, 0, 1, 0, 1, 1},
{0, 0, 1, 0, 1, 0, 0},
{1, 1, 1, 0, 1, 0, 0}
};
List<Integer> list = new ArrayList();//等待遍历的节点
Set<Integer> set = new HashSet(); //已经遍历的节点
list.add(0); //先将0节点插入
/**
* 将直接孩子全部加入list,顺序处理后,接着处理第一个孩子的孩子们
*/
while (true) {
if (list.isEmpty())
break;
int node = list.get(0);//获取第一个位置的节点号
System.out.println(node); //输出节点号
set.add(node); //标记一下已经遍历的
list.remove(0);//清除已经标记的位置为0的节点
for (int i = 0; i < a[node].length; i++) { //i代表节点号
if (a[node][i] == 1 && !set.contains(i) && list.indexOf(i) < 0) {
//list.indexOf(node)是防止不同的孩子他们 的孩子有可能相等,输出的节点号重复
list.add(i);
}
}
}
}