深度优先搜索(DFS)和广度优先搜索(BFS)
实际使用中,DFS远多于BFS。
如果只是为了遍历所有结点的话,那么DFS和BFS没什么差别,我们当然更倾向于更方便编写、空间复杂度更低的DFS遍历。
BFS应用场景:
1.求最短路径(遇到的第一个解,一定就是最优解)
DFS应用场景:
1.迷宫问题(判断能否从A点走到B点这种问题)

DFS搜索策略:从某个节点,沿着任一分支尽可能地搜索,直到最后一个节点
递归实现-如果层级过深,会导致栈溢出
遍历顺序:A|B|D|E|C
栈实现-先进后出
入栈顺序:A|BC|DE
出栈顺序:A|CB|ED

BFS搜索策略:逐层搜索,遍历下一层级的所有子节点
队列实现-先进先出
入队列顺序:A|BC|DE
出队列顺序:A|B|C|D|E

框架
// DFS递归实现 dfs(节点) { // 遍历当前节点的子节点 { // 满足访问条件 { // 标记子节点已访问 // dfs(子节点) // 回溯清除标记 } } } int main() { // 遍历可能的首节点 { // 满足访问条件 { // 标记初首节点已访问 // dfs(首节点) // 回溯清除标记 } } } // DFS栈实现 dfs(节点) { // 当前节点入栈 // 标记当前节点已访问 while(栈不为空) { // 出栈 // 遍历出栈节点的子节点 { // 子节点入栈 // 标记子节点已访问 } } }
// BFS队列实现 bfs(节点) { // 当前节点入队列 // 标记当前节点已访问 while(对列不为空) { // 出队列 // 遍历出队列节点下一层级的所有子节点 { // 子节点入队列 // 标记子节点已访问 } } }
浙公网安备 33010602011771号