好的,广度优先遍历(BFS)是一种树、图的遍历算法,它从树、图的起始节点开始,逐层遍历所有节点。在每一层中,它会遍历所有节点,然后进入下一层。BFS是深度优先遍历(DFS)的一种变体,它更适用于查找最短路径,因为BFS总是从起始节点开始搜索,而不会跳过节点,因此它会找到从起始节点到其他所有节点的最短路径。
思想
在实现BFS时,通常会使用一个队列来存储待访问的节点。首先,将起始节点放入队列中。然后,从队列中取出节点,并访问它。然后,将该节点的所有未访问的邻居节点放入队列中,以便它们可以在将来访问。这个过程会一直重复,直到队列为空为止。
假设有一个树的图:
我们如何进行层序遍历呢?
首先我们创建一个队列,将树的根节点放入:
接下来队列的头部节点出队,然后将出队节点的两个子节点入队:
然后继续出队头节点,将出队节点的子节点入队:
之后反复执行前面的步骤即可。
最后会出现这样的情况:
代码演示
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct Node {
int key;
struct Node *lchild, *rchild;
} Node;
Node *getNewNode(int key) {
Node *p = (Node *)malloc(sizeof(Node));
p->key = key;
p->lchild = p->rchild = NULL;
return p;
}
Node *insert(Node *root, int key) { //随机插入
if (root == NULL) return getNewNode(key);
if (rand() % 2) root->lchild = insert(root->lchild, key);
else root->rchild = insert(root->rchild, key);
return root;
}
void clear(Node *root) {
if (root == NULL) return ;
clear(root->lchild);
clear(root->rchild);
free(root);
return ;
}
/*************************************************************************/
//以上为树节点结构体的基本操作,由于树结构体生成困难,我选择了随机生成一颗树
//如果读者水平有限也可以选择忽略此代码
#define MAX_NODE 10
Node *queue[MAX_NODE + 5]; //以数组代替队列
int head, tail; //两个值表示数组的头尾节点的下标
void bfs(Node *root) { //广度优先遍历
head = tail = 0;
queue[tail++] = root;
while (head < tail) {
Node *node = queue[head];
printf("\nnode : %d\n", node->key);
if (node->lchild) {
queue[tail++] = node->lchild;
printf("\t%d->%d (left)\n", node->key, node->lchild->key);
}
if (node->rchild) {
queue[tail++] = node->rchild;
printf("\t%d->%d (right)\n", node->key, node->rchild->key);
}
head++;
}
return ;
}
int main() {
srand(time(0));
Node *root = NULL;
for (int i = 0; i < MAX_NODE; i++) {
root = insert(root, rand() % 100);
}
bfs(root);
return 0;
}