二叉树的遍历。采用BFS
和DFS
理论上都可以,这里采用BFS
。
首先给出BFS
的框架:
// 计算从起点 start 到终点 target 的最近距离
int BFS(Node start, Node target) {
Queue<Node> q; // 核心数据结构
Set<Node> visited; // 避免走回头路
q.offer(start); // 将起点加入队列
visited.add(start);
int step = 0; // 记录扩散的步数
while (q not empty) {
int sz = q.size();
/* 将当前队列中的所有节点向四周扩散 */
for (int i = 0; i < sz; i++) {
Node cur = q.poll();
/* 划重点:这里判断是否到达终点 */
if (cur is target)
return step;
/* 将 cur 的相邻节点加入队列 */
for (Node x : cur.adj())
if (x not in visited) {
q.offer(x);
visited.add(x);
}
}
/* 划重点:更新步数在这里 */
step++;
}
}
结合项目的代码:
public int minDepth(TreeNode root) {
if (root == null) return 0; //边界判断
Queue<TreeNode> q = new LinkedList<>(); //BFS通常使用队列,每次将一个节点周围的节点加入队列
q.offer(root); //根节点传入
int depth = 1; //根节点算1层
while(!q.isEmpty()) { //一直循环,直到找出最小深度/结束条件/框架中的target.
int sz = q.size(); //BFS,广度优先搜索,这里横向遍历【某一层】的节点
for (int i = 0; i < sz; i++) {
TreeNode curr = q.poll(); //取出队首节点
if (curr.left == null && curr.right == null) { //结束条件/框架中的target.
return depth;
}
if (curr.left != null) { //加入相邻的节点
q.offer(curr.left);
}
if (curr.right != null) { //同上
q.offer(curr.right);
}
}
depth++; //一层遍历完后,层级自动+1
}
return -1;
}
总结:
1.什么时候用BFS
:常用场景是让你在一幅【图】中找到,从起点start
到目标target
的最近距离,比如此题,不过它的target
不是形参,而是嵌入在代码中。
2.BFS
是有可套用框架的。
3.BFS
常用的数据结构是队列
。
4.BFS
意思着重在横向。
技术参考:labuladong