BFS

解决哪类问题

:::success 在树/图中搜索 :::

代码模板

如果不需要确定当前遍历到了哪一层

  1. Deque<Node> queue = new ArrayDeque<>();
  2. queue.push(root);
  3. while(!queue.isEmpty()) {
  4. Node cur = queue.pop(); // 从栈中取出
  5. for node in cur.children { // 获取所有邻接节点
  6. if (node.isValid() && !isVisit(node)) { // 该节点有效且未访问
  7. queue.push(node); // 放入堆栈
  8. }
  9. }
  10. }

如果要确定当前遍历到了哪一层

level表示二叉树遍历到哪一层或者图走了几步、size表示在当前层有多少个元素

  1. Deque<Node> queue = new ArrayDeque<>();
  2. queue.push(root)
  3. int level = 0
  4. while(!queue.isEmpty()) {
  5. int size = queue.size();
  6. while (size--) {
  7. Node cur = queue.pop(); // 从栈中取出
  8. for node in cur.children { // 获取所有邻接节点
  9. if (node.isValid() && !isVisit(node)) { // 该节点有效且未访问
  10. queue.push(node); // 放入堆栈
  11. }
  12. }
  13. }
  14. level++;
  15. }

复杂度

O(所有节点的规模)

运用思想

递归、迭代、枚举、贪心、回溯、剪枝

例题

题目 难度 推荐指数
90. 子集 II 中等 🤩🤩🤩🤩
297. 二叉树的序列化与反序列化 困难 🤩🤩🤩🤩
397. 整数替换 中等 🤩🤩🤩🤩
403. 青蛙过河 困难 🤩🤩🤩🤩
429. N 叉树的层序遍历 中等 🤩🤩🤩🤩
559. N 叉树的最大深度 简单 🤩🤩🤩🤩
589. N 叉树的前序遍历 简单 🤩🤩🤩
590. N 叉树的后序遍历 简单 🤩🤩🤩
690. 员工的重要性 简单 🤩🤩🤩
778. 水位上升的泳池中游泳 困难 🤩🤩🤩
783. 二叉搜索树节点最小距离 简单 🤩🤩🤩
821. 字符的最短距离 简单 🤩🤩🤩🤩
838. 推多米诺 中等 🤩🤩🤩🤩
938. 二叉搜索树的范围和 简单 🤩🤩🤩
993. 二叉树的堂兄弟节点 简单 🤩🤩
1609. 奇偶树 中等 🤩🤩🤩🤩🤩

题目 难度 推荐指数
127. 单词接龙 困难 🤩🤩🤩🤩🤩
403. 青蛙过河 困难 🤩🤩🤩🤩🤩
417. 太平洋大西洋水流问题 中等 🤩🤩🤩🤩🤩
752. 打开转盘锁 中等 🤩🤩🤩🤩
773. 滑动谜题 困难 🤩🤩🤩🤩
815. 公交路线 困难 🤩🤩🤩🤩
847. 访问所有节点的最短路径 困难 🤩🤩🤩🤩🤩
863. 二叉树中所有距离为 K 的结点 中等 🤩🤩🤩🤩
909. 蛇梯棋 中等 🤩🤩🤩🤩
1020. 飞地的数量 中等 🤩🤩🤩
1034. 边界着色 中等 🤩🤩🤩🤩
1036. 逃离大迷宫 中等 🤩🤩🤩🤩
1162. 地图分析 中等 🤩🤩🤩🤩
1345. 跳跃游戏 IV 困难 🤩🤩🤩🤩🤩
1765. 地图中的最高点 中等 🤩🤩🤩🤩
2039. 网络空闲的时刻 中等 🤩🤩🤩
2045. 到达目的地的第二短时间 困难 🤩🤩🤩🤩
2059. 转化数字的最小运算数 中等 🤩🤩🤩🤩🤩
LCP 07. 传递信息 简单 🤩🤩🤩🤩