617. 合并二叉树
1. DFS + 递归
var mergeTrees = function (root1, root2) {if (root1 && root2) {root1.val += root2.val;root1.left = mergeTrees(root1.left, root2.left); // 处理左边的树root1.right = mergeTrees(root1.right, root2.right); // 处理右边的树}return root1 || root2;};
可以从 “归” 开始回看。
return root1 || root2;- 只要 root1 一开始不是空,那么,最后一次 return 时,会将 root1 返回
687. 最长同值路径
方法1 - DFS
var longestUnivaluePath = function (root) {let ans = 0;const dfs = (root) => {if (root === null) return 0;const left = dfs(root.left), right = dfs(root.right);let l = 0, r = 0;if (root.left && root.left.val === root.val) l = left + 1;if (root.right && root.right.val === root.val) r = right + 1;ans = Math.max(ans, l + r);return Math.max(l, r);}dfs(root);return ans;};
幻灯片语法不支持。
695. 岛屿的最大面积
1. DFS + 递归
var maxAreaOfIsland = function (grid) {// 递归,遍历与当前陆地相连的所有陆地const dfs = (grid, i, j) => {if (i < 0 || j < 0 || i > totalRowNum - 1 || j > totalColNum - 1) return 0; // 越界if (grid[i][j] !== 1) return 0; // 不是陆地// 这个点是陆地grid[i][j] = 0; // 将遍历过的陆地全部置 0,防止重复遍历return 1 + // 1 表示当前这个点是陆地dfs(grid, i - 1, j) + // 上dfs(grid, i + 1, j) + // 下dfs(grid, i, j - 1) + // 左dfs(grid, i, j + 1); // 右}let result = 0; // 最终结果// 遍历 gridconst totalRowNum = grid.length, // 总行数totalColNum = grid[0].length; // 总列数for (let i = 0; i < totalRowNum; i++) { // 遍历行for (let j = 0; j < totalColNum; j++) { // 遍历列result = Math.max(result, dfs(grid, i, j));}}return result;};
如何防止同一个陆地被重复遍历?
- 但凡是遍历过的陆地(也就是被计数过的陆地),就将其重置为 0;重置以后,下次再遍历到它时,它将不再被识别为陆地。
