宽度优先编程(Breadth-First Search, BFS)是一种用于遍历或搜索树或图的算法。它从图的某一顶点出发,访问所有相邻的顶点,然后再移向下一层邻居,以此类推。这种方法可以用于寻找最短路径、检测两个顶点是否连通、遍历图的所有顶点等。
基本步骤
初始化:
创建一个队列,并将起始节点加入队列。
遍历:
从队列中取出一个节点,访问它,并将其所有未访问的邻居节点加入队列。
终止条件:
如果队列为空,表示所有可达节点都已访问,算法结束。
代码示例
Java
```java
import java.util.*;
public class BFS {
public static List List if (root == null) { return result; } Queue queue.offer(root); while (!queue.isEmpty()) { int levelSize = queue.size(); List for (int i = 0; i < levelSize; i++) { TreeNode currentNode = queue.poll(); currentLevel.add(currentNode.val); for (TreeNode neighbor : currentNode.neighbors) { if (!neighbor.visited) { queue.offer(neighbor); neighbor.visited = true; } } } result.add(currentLevel); } return result; } } class TreeNode { int val; List boolean visited; TreeNode(int x) { val = x; neighbors = new ArrayList<>(); visited = false; } } ``` C语言 ```c include include include define MAX_SIZE 100 int graph[MAX_SIZE][MAX_SIZE]; bool visited[MAX_SIZE]; int queue[MAX_SIZE]; int front = -1, rear = -1; void enqueue(int x) { if (rear == MAX_SIZE - 1) { printf("Queue is full\n"); return; } rear++; queue[rear] = x; } int dequeue() { if (front == rear) { printf("Queue is empty\n"); return -1; } front++; return queue[front]; } void bfs(int start, int n) { visited[start] = true; enqueue(start); while (front != rear) { int current = dequeue(); printf("%d ", current); for (int i = 0; i < n; i++) { if (!visited[graph[current][i]]) { queue[rear++] = graph[current][i]; visited[graph[current][i]] = true; } } } } int main() { // Initialize the graph and call bfs function // Example: bfs(0, 5); return 0; } ``` 建议 选择合适的数据结构:使用队列来实现宽度优先搜索,可以有效地管理节点的访问顺序。 初始化:确保起始节点和队列的正确初始化。 访问标记:使用一个布尔数组来标记节点是否已经被访问,避免重复访问。 扩展性:对于大型图,考虑使用更高效的数据结构或算法来优化性能。 通过以上步骤和代码示例,你可以实现宽度优先编程来解决各种问题。> levelOrder(TreeNode root) {
> result = new ArrayList<>();