递归:就是出现这种情况的代码: (或者说是用到了栈)
解答树角度:在dfs遍历一棵解答树
优点:结构简洁
缺点:效率低,可能栈溢出
递归的一般结构:
void f() {
if(符合边界条件) {
///////
return;
} //某种形式的调用
f();
}
回溯:递归的一种,或者说是通过递归这种代码结构来实现回溯这个目的。回溯法可以被认为是一个有过剪枝的DFS过程。
解答树角度:带回溯的dfs遍历一棵解答树
回溯的一般结构:
void dfs(int 当前状态) {
if(当前状态为边界状态) {
记录或输出
return;
}
for(i=;i<n;i++) { //横向遍历解答树所有子节点
//扩展出一个子状态。
修改了全局变量
if(子状态满足约束条件) {
dfs(子状态)
}
恢复全局变量//回溯部分
}
}
BFS和DFS是相似。
BFS(显式用队列)
DFS(隐式用栈)(即递归)
当然,对于DFS,用递归可能会造成栈溢出,所以也可以更改为显示栈。
void bfs(node &head) {
//将(起始)首节点加入队列
q.push(head);
//标记首节点已经被访问
isvisited[head]=true; while(!q.empty()){
int temp=q.front();
q.pop();
//访问temp,并标记temp已被访问过,将temp的子相关节点加入队列
q.push(temp相关节点);
}
}
Reference:
http://blog.****.net/fightforyourdream/article/details/12866861