BFS问题处理模板

  1. // 计算从起点 start 到终点 target 的最近距离
  2. int BFS(Node start, Node target) {
  3. Queue<Node> q; // 核心数据结构
  4. Set<Node> visited; // 避免走回头路
  5. q.offer(start); // 将起点加入队列
  6. visited.add(start);
  7. int step = 0; // 记录扩散的步数
  8. while (q not empty) {
  9. int sz = q.size();
  10. /* 将当前队列中的所有节点向四周扩散 */
  11. for (int i = 0; i < sz; i++) {
  12. Node cur = q.poll();
  13. /* 划重点:这里判断是否到达终点 */
  14. if (cur is target)
  15. return step;
  16. /* 将 cur 的相邻节点加入队列 */
  17. for (Node x : cur.adj())
  18. if (x not in visited) {
  19. q.offer(x);
  20. visited.add(x);
  21. }
  22. }
  23. /* 划重点:更新步数在这里 */
  24. step++;
  25. }
  26. }

BFS典型案例

LeetCode 102. 二叉树的层序遍历

  1. class Solution {
  2. public List<List<Integer>> levelOrder(TreeNode root) {
  3. return bfs(root);
  4. }
  5. private List<List<Integer>> bfs(TreeNode root) {
  6. List<List<Integer>> result = new ArrayList<>();
  7. if (root == null) {
  8. return result;
  9. }
  10. //BFS类型问题模板, 如果是图等其他结构,还需要用set等保存已经访问过的节点,避免重复访问
  11. //1.初始化Queue,添加头结点
  12. Queue<TreeNode> queue = new LinkedList<>();
  13. queue.offer(root);
  14. //遍历Queue
  15. while (!queue.isEmpty()) {
  16. int size = queue.size();
  17. List<Integer> row = new ArrayList<>();
  18. for (int i=0; i< size; i++) {
  19. TreeNode node = queue.poll();
  20. row.add(node.val);
  21. if (node.left != null) {
  22. queue.offer(node.left);
  23. }
  24. if (node.right != null) {
  25. queue.offer(node.right);
  26. }
  27. }
  28. result.add(row);
  29. }
  30. //其他处理
  31. return result;
  32. }
  33. }

DFS问题处理模板

DFS问题的递归写法:
WechatIMG2.png
DFS的非递归写法
WechatIMG3.png

DFS典型案例

LeetCode 200. 岛屿数量

  1. class Solution {
  2. public int numIslands(char[][] grid) {
  3. //处理边界
  4. if (grid.length == 0) {
  5. return 0;
  6. }
  7. int m = grid.length;
  8. int n = grid[0].length;
  9. int count = 0;
  10. for (int i=0; i<m; i++) {
  11. for (int j=0; j< n; j++) {
  12. if (grid[i][j] == '1') {
  13. count++;
  14. dfs(i, j, m, n, grid);
  15. }
  16. }
  17. }
  18. return count;
  19. }
  20. private void dfs(int i, int j, int m, int n, char[][] grid) {
  21. if (i<0 || i>=m || j<0 || j>=n || grid[i][j] != '1') {
  22. return;
  23. }
  24. grid[i][j] = '0';
  25. dfs(i-1, j, m, n, grid);
  26. dfs(i+1, j, m, n, grid);
  27. dfs(i, j-1, m, n, grid);
  28. dfs(i, j+1, m, n, grid);
  29. }
  30. }

LeetCode 113. 路径总和 ||

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. class Solution {
  11. public List<List<Integer>> pathSum(TreeNode root, int sum) {
  12. List<List<Integer>> result = new ArrayList<>();
  13. if (root == null) {
  14. return result;
  15. }
  16. dfs(root, 0, sum, new ArrayList<>(), result);
  17. return result;
  18. }
  19. private void dfs(TreeNode root, int now, int sum, List<Integer> path, List<List<Integer>> res) {
  20. if (root == null) {
  21. return;
  22. }
  23. //这里把root加入进去
  24. path.add(root.val);
  25. if (root.left == null && root.right == null) {
  26. if (sum == root.val+ now) {
  27. res.add(path);
  28. }
  29. return;
  30. }
  31. if (root.left != null) {
  32. dfs(root.left, now + root.val, sum, new ArrayList<>(path), res);
  33. }
  34. if (root.right != null) {
  35. dfs(root.right, now + root.val, sum, new ArrayList<>(path), res);
  36. }
  37. }
  38. }