读书人

递归回望DFSBFS的理解和模板

发布时间: 2013-10-22 16:16:51 作者: rapoo

递归,回溯,DFS,BFS的理解和模板

LeetCode 里面很大一部分题目都是属于这个范围,例如Path Sum用的就是递归+DFS,Path Sum2用的是递归+DFS+回溯


这里参考了一些网上写得很不错的文章,总结一下理解与模板

递归:就是出现这种情况的代码: (或者说是用到了栈)

解答树角度:在dfs遍历一棵解答树

优点:结构简洁

缺点:效率低,可能栈溢出


递归的一般结构:

将(起始)首节点加入队列: q.push(head);                     标记首节点已经被访问:         isvisited[head]=true;                    以下自动反应:                       while(!q.empty())                                                                    {                                                                          int temp=q.front();                                                                           q.pop();                                                                          访问temp,并标记temp已被访问过,将temp的子相关节点加入队列                                                                          q.push(temp相关节点);                                                                    }

DFS:典型例题:P107黑白图像

格式:将所有节点遍历一遍,在遍历每个节点是,DFS的遍历该节点相关的所有节点

void dfs(int x, int y){if(!mat[x][y] || vis[x][y]) return;     // 曾经访问过这个格子,或者当前格子是白色vis[x][y] = 1;                          // 标记(x,y)已访问过dfs(x-1,y-1); dfs(x-1,y); dfs(x-1,y+1);dfs(x-1,y);               dfs(x,y+1);dfs(x+1,y-1); dfs(x+1,y); dfs(x+1,y+1); // 递归访问周围的八个格子}主循环:for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)if(!vis[i][j] && mat[i][j]){count++;dfs(i,j);} // 找到没有访问过的黑格

Ref:

http://hi.baidu.com/silverxinger/item/cdcd900ca34e988402ce1ba0

http://hi.baidu.com/lvhuyh/item/960c5b163c4d7cd539cb309b

http://www.cnblogs.com/HectorInsanE/archive/2010/11/09/1872656.html








读书人网 >编程

热点推荐