BFS&DFS
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情 >>
| BFS | DFS | |
|---|---|---|
| 1 | 广度优先搜索 | 深度优先搜索 |
| 2 | 本质上是队列 | 本质上是栈 |
| 3 | 可以被用来找最短路径在一个无权图里 | 搜索更多的边,为了去寻找到一个目的顶点 |
| 4 | 跟适合找路径的最近距离 | 更适合寻找决策 |
| 5 | 会考虑所有的邻居节点,并不适合用于游戏或者谜题决策树 | DFS 更适合游戏或解谜问题。我们做出决定,然后通过这个决定探索所有路径。如果这个决定导致获胜的局面,就返回。 |
| 6 | 邻居先于孩子被访问 | 孩子先于邻居被访问 |
| 7 | BFS的时间复杂度在使用邻接列表时为O(V + E),在使用邻接矩阵时为O(V^2),其中V代表顶点,E代表边。 | DFS的时间复杂度在使用邻接列表时也是O(V + E),使用邻接矩阵时也是O(V^2),其中V代表顶点,E代表边。 |
| 8 | 没有任何的回溯思想 | 基于递归的回溯思想 |
| 9 | 适用于二分图的寻找,最短路径 计算图的连通性、计算最小操作次数等 | 无环图和拓扑顺序等。火力中心布局 |
| 10 | 需要更多的内存空间 | 需要更少的内存空间 |
go语言bfs模版
queue := []*TreeNode{}
queue = append(queue, root)
for len(queue) > 0 {
level := []int{}
size := len(queue)
for i := 0; i < size; i++ {
node := queue[0]
queue = queue[1:]
// 进行操作
if node.Left != nil {
queue = append(queue, node.Left)
}
if node.Right != nil {
queue = append(queue, node.Right)
}
}
}
go语言dfs模板
stack := []*TreeNode{}
for root != nil || len(stack) > 0 {
for root != nil {
stack = append(stack, root)
root = root.Left
}
root = stack[len(stack)-1]
stack = stack[:len(stack)-1]
// 进行操作
root = root.Right
}
总结
- 深度优先使用栈,广度优先使用队列,栈和队列可以采用列表进行模拟
- dfs的遍历结果和前序遍历的结果是一样的。也可以用栈的形态进行前、中、后序遍历