[[]]的套路
模板
let marksSet = new Setfunction dfs(i,j){// 如果i越界或者j越界就结束if(i>arr[1].length||j>arr.length) return// 如果访问过就算了if(marksSet.has(`${i}-${j}`)) return// marksSet 存储标记我来过了marksSet.add(`${i}-${j}`)return dfs(i + 1, j)+dfs(i, j+1)+dfs(i-1, j)+dfs(i, j-1)+1// 有特殊情况也可以 marksSet.delete(`${i}-${j}`)}// 单点入口dfs(0,0)// 多点入口for(let j in arr){for(let k in arr[j]){dfs(j,k)}}
上面用到了Set缓存,有些时候不用单独存,只需要原地缓存就好。也就是直接将当前值变为一个特定值,只要等于特定值就说明缓存了。
function dfs(i,j){// 如果i越界或者j越界就结束if(i>arr.length||j>arr[0].length||i<0||j<0||arr[i][j]==-1) returnarr[i][j] = -1return dfs(i + 1, j)+dfs(i, j+1)+dfs(i-1, j)+dfs(i, j-1)+1// 有特殊情况也可以 marksSet.delete(`${i}-${j}`)}
例题
树的DFS
if (!root) return 0;dfs(root)function dfs(root){// 有时候需要存储个状态,一般不用,直接往下突就完事了if(root){// dosomething}dfs(root.left)dfs(root.right)}
例题
129求根到叶子节点数字之和
