递归,回溯,DFS,BFS的理解和模板
来源:互联网 发布:手机版电影特效软件 编辑:程序博客网 时间:2024/06/11 07:33
LeetCode 里面很大一部分题目都是属于这个范围,例如Path Sum用的就是递归+DFS,Path Sum2用的是递归+DFS+回溯
这里参考了一些网上写得很不错的文章,总结一下理解与模板
递归:就是出现这种情况的代码: (或者说是用到了栈)
解答树角度:在dfs遍历一棵解答树
优点:结构简洁
缺点:效率低,可能栈溢出
递归的一般结构:
- void f()
- {
- if(符合边界条件)
- {
- ///////
- return;
- }
- //某种形式的调用
- f();
- }
回溯:递归的一种,或者说是通过递归这种代码结构来实现回溯这个目的。回溯法可以被认为是一个有过剪枝的DFS过程。
解答树角度:带回溯的dfs遍历一棵解答树
回溯的一般结构:
- void dfs(int 当前状态)
- {
- if(当前状态为边界状态)
- {
- 记录或输出
- return;
- }
- for(i=0;i<n;i++) //横向遍历解答树所有子节点
- {
- //扩展出一个子状态。
- 修改了全局变量
- if(子状态满足约束条件)
- {
- dfs(子状态)
- }
- 恢复全局变量//回溯部分
- }
- }
BFS和DFS是相似。
BFS(显式用队列)
DFS(隐式用栈)(即递归)
当然,对于DFS,用递归可能会造成栈溢出,所以也可以更改为显示栈。
BFS:典型例题:P101 对于二叉树的层次遍历,P108对于图的走迷宫最短路径
- 将(起始)首节点加入队列: 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
阅读全文
0 0
- 递归,回溯,DFS,BFS的理解和模板
- 递归,回溯,DFS,BFS的理解和模板
- 如何学习递归,回溯,DFS,BFS.
- BFS和DFS模板
- DFS和BFS模板
- bfs和dfs 模板
- 模板--bfs和dfs
- DFS和BFS模板
- BFS/DFS的理解和框架
- dfs和回溯法的应用以及模板
- DFS、BFS和Backtracking模板
- DFS BFS 回溯法
- 回溯,BFS,DFS学习
- 图 DFS BFS 回溯
- !ZOJ 2100--DFS(递归结束条件和回溯还是没理解好)
- DFS和BFS的思路模板伪代码
- 准备一个dfs和bfs的模板吧
- 回溯和DFS的区别
- 输入输出挂
- 进制转换模板
- SpringBoot日志logback-spring.xml分环境
- HDU 1003-最大连续子序列的和-java
- 创建进程,分析父子进程关系以及结束进程。
- 递归,回溯,DFS,BFS的理解和模板
- SyntaxError: Non-ASCII character '\xe5'
- CS224d: Deep Learning for NLP Lecture1 概率复习(1)
- SpringBoot轻松实现文件上传
- window10 安装 Laravel/Homestead
- zabbix实现web监控
- zabbix分布式环境使用
- win7 安装mysql5.7
- ListView基本用法大全