思想:从root节点开始,尽可能深的搜索每一个分支,把一个分支的结果搜索完了以后,再去看下一个分支。
例子:走迷宫
走一条路到终点,再去走其他的路
class Solution { public int numIslands(char[][] grid) { //当二位数组为空的时候,岛屿肯定是0 if(grid == null){ return 0; } //统计岛屿数 int result=0; //从头遍历二位数组,目的是遍历"1",当遍历到”1“的时候调用传染函数 for(int i =0;i<grid.length;i++){ for(int j=0;j<grid[0].length;j++){ if(grid[i][j]=='1'){ //岛屿数加1 result++; //调用感染函数,把行,列,二维数组作为参数传过去 dfs(i,j,grid); } } } //岛屿数 return result; } //感染函数,用到的思想是深度优先遍历 public int dfs(int i,int j,char[][] grid){ //当行或列不合法(小于0或超出范围)或对应的值是0(说明是海洋),就返回上一层 if(i<0||i>=grid.length||j<0||j>=grid[0].length||grid[i][j]=='0'){ return 0; } //使其变成”0“,这样前面遍历的时候就不会遍历到这个数,也就不会将其计入岛屿数 grid[i][j]='0'; //将上下左右相连的数组的数全变成”0“并对继续向下递归 dfs(i,j+1,grid); dfs(i+1,j,grid); dfs(i-1,j,grid); dfs(i,j-1,grid); //返回上一次层 return 0; } }