广度优先搜索一层一层遍历,每一层遍历到的所有新节点,要用队列先存储起来以备下一层遍历的时候再遍历;而深度优先搜索在遍历到一个新节点时立马对新节点进行遍历:从节点 0 出发开始遍历,得到到新节点 6 时,立马对新节点 6 进行遍历,得到新节点 4;如此反复以这种方式遍历新节点,直到没有新节点了,此时返回。返回到根节点 0 的情况是,继续对根节点 0 进行遍历,得到新节点 2,然后继续以上步骤。
从一个节点出发,使用 DFS 对一个图进行遍历时,能够遍历到的节点都是从初始节点可达的,DFS 常用来求解这种 可达性 问题。
在程序实现 DFS 时需要考虑以下问题:
- 栈:用栈来保存当前节点信息,当遍历新节点返回时能够继续遍历当前节点。也可以使用递归栈。
- 标记:和 BFS 一样同样需要对已经遍历过得节点进行标记。
class Solution { public int maxAreaOfIsland(int[][] grid) { int m=grid.length; int n=grid[0].length; int maxv=0; for (int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(grid[i][j]==1){ maxv=Math.max(maxv,dfs(grid,i,j)); } } } return maxv; } public int dfs(int[][] grid,int i,int j){ int m=grid.length; int n=grid[0].length; if(i<0||i>=m||j<0||j>=n) return 0;//注意这个是有可能的,因为比方是在0,0起点或者边界的时候都会出现越界,因为最后一行 if(grid[i][j]==0) return 0; grid[i][j]=0; return dfs(grid,i-1,j)+dfs(grid,i,j-1)+dfs(grid,i+1,j)+dfs(grid,i,j+1)+1;//不要忘记+1,处理当前的数值 } }