算法学习之BFS广度优先搜索(java版)
广度优先搜索就如其名字一样,优先横向搜索,通常用于树和图中。
概念
图中给出了一棵二叉树,按照广度优先算法输出的结果是:1, 2, 3, 4, 5, 6
可以将广度优先算法抽象成队列的入队与出队的过程。
设队列为queue,并初始化为空
- queue=[1],首个节点入队(表示待搜索节点)
- queue=[2, 3],队列内头部节点出队(表示已经搜索了该节点),将该节点的左右子节点入队插入到尾部(表示其子节点待搜索)
- queue=[3, 4, 5],队列内头部节点2出队,将节点2的两个子节点入队插入到尾部。
- queue=[4, 5, 6],队列内头部节点3出队,将节点3的子节点入队插入到尾部。
- queue=[5,6],队列内头部节点4出队,已无子节点。
- queue=[6],队列内头部节点5出队,已无子节点。
- queue=[],队列内头部节点6出队,已无子节点。
- 算法结束
注意:数据结构中队列的特性先进先出。
框架
class Node {
intval;
Node left;
Node right;
}
public static int BFS(Node start, Node target) {
Queue<Node> q = new LinkedList<>(); // 核心数据结构队列
q.offer(start);
int step = 1; // 记录步骤
while (!q.isEmpty()) {
// 一层走到下一层
int sz = q.size();
// 取当前节点,往下走
for (int i = 0; i < sz; i++)