LeetCode BFS 练习题单与模板总结 (Golang 实现)
BFS(广度优先搜索)是一种重要的图遍历算法,特别适合解决最短路径、层次遍历等问题。以下是 Golang 实现的 BFS 模板和分类练习题单。
BFS 通用模板 (Golang)
1. 树的 BFS 模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| type TreeNode struct { Val int Left *TreeNode Right *TreeNode }
func levelOrder(root *TreeNode) [][]int { if root == nil { return [][]int{} } var result [][]int queue := []*TreeNode{root} for len(queue) > 0 { levelSize := len(queue) currentLevel := make([]int, 0, levelSize) for i := 0; i < levelSize; i++ { node := queue[0] queue = queue[1:] currentLevel = append(currentLevel, node.Val) if node.Left != nil { queue = append(queue, node.Left) } if node.Right != nil { queue = append(queue, node.Right) } } result = append(result, currentLevel) } return result }
|
2. 图的 BFS 模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| func bfsGraph(start Node) []Node { visited := make(map[Node]bool) visited[start] = true queue := []Node{start} result := []Node{} for len(queue) > 0 { node := queue[0] queue = queue[1:] result = append(result, node) for _, neighbor := range getNeighbors(node) { if !visited[neighbor] { visited[neighbor] = true queue = append(queue, neighbor) } } } return result }
|
LeetCode BFS 练习题单 (Golang)
基础练习
二叉树的层次遍历
简单图/BFS应用
进阶练习
最短路径问题
复杂图/BFS应用
多源BFS
困难级别挑战
- 815. 公交路线
- 864. 获取所有钥匙的最短路径
- 1293. 网格中的最短路径
Golang BFS 实现技巧
队列实现:Golang 中可以用 slice 实现队列,但要注意 dequeue 操作是 O(n)
1 2 3 4 5 6
| queue = append(queue, node)
node := queue[0] queue = queue[1:]
|
性能优化:对于大型队列,可以使用链表或固定大小的循环队列
1 2 3 4 5 6
| type Queue struct { nodes []*TreeNode head int tail int count int }
|
visited 记录:对于图问题,使用 map 记录已访问节点
1
| visited := make(map[*Node]bool)
|
方向数组:处理网格问题时很有用
1
| dirs := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
|
示例题解:200. 岛屿数量 (Golang)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| func numIslands(grid [][]byte) int { if len(grid) == 0 { return 0 } m, n := len(grid), len(grid[0]) count := 0 dirs := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}} for i := 0; i < m; i++ { for j := 0; j < n; j++ { if grid[i][j] == '1' { count++ grid[i][j] = '0' queue := [][]int{{i, j}} for len(queue) > 0 { cell := queue[0] queue = queue[1:] for _, dir := range dirs { x, y := cell[0]+dir[0], cell[1]+dir[1] if x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' { grid[x][y] = '0' queue = append(queue, []int{x, y}) } } } } } } return count }
|