BFS&DFS

137 阅读2分钟

BFS&DFS

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情 >>


img

BFSDFS
1广度优先搜索深度优先搜索
2本质上是队列本质上是栈
3可以被用来找最短路径在一个无权图里搜索更多的边,为了去寻找到一个目的顶点
4跟适合找路径的最近距离更适合寻找决策
5会考虑所有的邻居节点,并不适合用于游戏或者谜题决策树DFS 更适合游戏或解谜问题。我们做出决定,然后通过这个决定探索所有路径。如果这个决定导致获胜的局面,就返回。
6邻居先于孩子被访问孩子先于邻居被访问
7BFS的时间复杂度在使用邻接列表时为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的遍历结果和前序遍历的结果是一样的。也可以用栈的形态进行前、中、后序遍历

参考

【算法】二叉树的遍历指南(前序、中序、后序、层序、BFS、DFS)

白话解释 DFS 与 BFS 算法 (二叉树的先序遍历,中序遍历、后序遍历、层次遍历)