一、DFS(深度优先搜索)——使用栈或者递归
模版:
dfs出口,不满足条件就退出
操作
递归,接着进一步DFS
二、BFS(广度优先搜索)——使用队列
模版:
条件判断(边界判断,其他要求的判断)
创建队列
在队列中加入第一个满足条件的元素
while(队列不为空) {
取出队列头部元素
操作
根据头部元素,往队列中再次加入满足条件的元素
}
leetcode题目为例子进行应用:
方法一、DFS(递归)
/** * @param {number[][]} image * @param {number} sr * @param {number} sc * @param {number} newColor * @return {number[][]} */ var floodFill = function(image, sr, sc, newColor) { direction=[[0,1],[0,-1],[1,0],[-1,0]]; if(image[sr][sc]!= newColor){ var oldcolor = image[sr][sc]; image[sr][sc] = newColor; for(var k=0;k<4;k++){ var newx = sr+direction[k][0]; var newy = sc+direction[k][1]; if(newx>=0 && newx<image.length && newy>=0 && newy<image[0].length && image[newx][newy]==oldcolor){ floodFill(image,newx,newy,newColor); } } } return image; };
方法二、BFS(使用队列)
/** * @param {number[][]} image * @param {number} sr * @param {number} sc * @param {number} newColor * @return {number[][]} */ var floodFill = function(image, sr, sc, newColor) { if (image == null || image.length == 0 || image[0].length == 0 || image[sr][sc] == newColor) return image; var dir=[[0,1],[0,-1],[-1,0],[1,0]]; var arr = []; var oldcolor=image[sr][sc]; arr.push(sr * image[0].length + sc); while(arr.length>0){ var str = arr.shift(); var x=Math.floor(str/(image[0].length)); var y=str%(image[0].length); image[x][y]=newColor; for(var k=0;k<4;k++){ var newx=x+dir[k][0]; var newy=y+dir[k][1]; //这里的条件判断如果把image[newx][newy]==oldcolor放到前面就会报错,不知道为什么? if( newx>=0 && newx<image.length && newy>=0 && newy<(image[0].length) && image[newx][newy]==oldcolor ) { arr.push(newx * (image[0].length) + newy); } } } return image; };