广度优先搜索是一种用于图以及树数据结构中的算法,用于遍历或搜索节点。该算法从根节点(或开始节点)开始,依次访问其所有相邻的节点,然后再访问这些相邻节点的相邻节点,以此类推。BFS 使用队列(Queue)数据结构来存储待访问节点。
广度优先搜索的基本思想是,首先访问根节点,然后将根节点的所有相邻节点加入到队列中。然后依次从队列中取出每个节点,访问该节点,并将其未访问过的相邻节点加入到队列末尾。这样可以保证按照层级依次遍历图或树的节点,即先访问离根节点最近的节点,再访问离根节点更远的节点。
例如如同二叉树,使用广度优先搜索将先从根节点出发,按照层次一层一层进行遍历。从1出发1--2--3--4--5--6--7
BFS 使用队列的先进先出(FIFO)特性,确保了树或图的层级遍历顺序。这意味着在同一层级上的节点会在较远层级的节点之前被访问到。BFS 应用广泛,例如最短路径问题、查找最近邻居等。
如下C语言举例
void BFS(int graph[MAX_NODES][MAX_NODES], int start, int n) {
int visited[MAX_NODES] = {0};
int queue[MAX_NODES];
int front = 0, rear = 0;
visited[start] = 1;
queue[rear++] = start;
while (front < rear) {
int current = queue[front++];
printf("%d ", current);
for (int i = 0; i < n; i++) {
if (graph[current][i] && !visited[i]) {
visited[i] = 1;
queue[rear++] = i;
}
}
}
}