递归:就是出现这种情况的代码: (或者说是用到了栈)
解答树角度:在dfs遍历一棵解答树
优点:结构简洁缺点:效率低,可能栈溢出递归的一般结构:
1 void f() {2 if(符合边界条件) {3 ///4 return;5 }6 7 //某种形式的调用8 f();9 }
回溯:递归的一种,或者说是通过递归这种代码结构来实现回溯这个目的。回溯法可以被认为是一个有过剪枝的DFS过程。
解答树角度:带回溯的dfs遍历一棵解答树回溯的一般结构:1 void dfs(int 当前状态) { 2 if(当前状态为边界状态) { 3 记录或输出 4 return; 5 } 6 for(i=0;i
BFS和DFS是相似。
BFS(显式用队列)DFS(隐式用栈)(即递归)当然,对于DFS,用递归可能会造成栈溢出,所以也可以更改为显示栈。1 void bfs(node &head) { 2 //将(起始)首节点加入队列 3 q.push(head); 4 //标记首节点已经被访问 5 isvisited[head]=true; 6 7 while(!q.empty()){ 8 int temp=q.front(); 9 q.pop();10 //访问temp,并标记temp已被访问过,将temp的子相关节点加入队列11 q.push(temp相关节点);12 }13 }
Reference: