voidbfs(TreeNode root){ Queue<TreeNode> queue = new ArrayDeque<>(); queue.add(root); while (!queue.isEmpty()) { TreeNode node = queue.poll(); // Java 的 pop 写作 poll() if (node.left != null) { queue.add(node.left); } if (node.right != null) { queue.add(node.right); } } }
二叉树BFS层序遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
voidbfs(TreeNode root){ Queue<TreeNode> queue = new ArrayDeque<>(); queue.add(root); while (!queue.isEmpty()) { int n = queue.size(); for (int i = 0; i < n; i++) { // 变量 i 无实际意义,只是为了循环 n 次 TreeNode node = queue.poll(); if (node.left != null) { queue.add(node.left); } if (node.right != null) { queue.add(node.right); } } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
voidbfs(TreeNode root){ Queue<TreeNode> queue = new ArrayDeque<>(); queue.add(root); while (!queue.isEmpty()) { Queue<TreeNode> nextQueue = new ArrayDeque<>(); while(!queue.isEmpty()) { // 变量 i 无实际意义,只是为了循环 n 次 TreeNode node = queue.poll(); if (node.left != null) { nextQueue.add(node.left); } if (node.right != null) { nextQueue.add(node.right); } } queue.addAll(nextQueue); } }
网格 DFS 遍历的框架代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
voiddfs(int[][] grid, int r, int c){ // 判断 base case // 如果坐标 (r, c) 超出了网格范围,直接返回 if (!inArea(grid, r, c)) { return; } // 访问上、下、左、右四个相邻结点 dfs(grid, r - 1, c); dfs(grid, r + 1, c); dfs(grid, r, c - 1); dfs(grid, r, c + 1); }
// 判断坐标 (r, c) 是否在网格中 booleaninArea(int[][] grid, int r, int c){ return0 <= r && r < grid.length && 0 <= c && c < grid[0].length; }