import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Test {
public static void main(String[] args) {
// 图的邻接表定义
int[][] g = { { 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 },
{ 0, 1, 1, 0, 1, 0, 0 } };
// 广度优先遍历
List lst = new ArrayList();// 等待遍历
Set tag = new HashSet();// 已经遍历节点集合
lst.add(0); // 初始态,从0号开始遍历
while(true) {
if (lst.isEmpty())// 列表空的时候,遍历结束
break;
int node = (Integer) lst.get(0);// 取得0号元素
System.out.println(node);// 立即输出这个元素
tag.add(node);// 加入到标记中
lst.remove(0);// 同时把该元素从lst中删除
// 处理这个节点紧跟的所有孩子
for (int i = 0; i < g[node].length; i++) {// 第node行所有的元素进行查找
if (g[node][i] == 1 // 表示着两个节点间是有连接线的
&& tag.contains(i) == false// 排除已经遍历过的节点,在tag中判断是否包含这个节点
&& lst.indexOf(i) < 0) {// 不同的节点可能有相同的孩子,判断i节点是否已经在lst中了,<0即=-1,找不到。
lst.add(i);// 加入lst中等待遍历
}
}
}
}
}
广度优先遍历-示例
最新推荐文章于 2023-10-09 13:42:51 发布