数据结构 广度优先遍历 c语言

好的,广度优先遍历(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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
广度优先遍历(BFS)是一种图或树的遍历算法,其思想是从起点开始,按照距离递增的顺序依次访问与其相邻的节点,直到所有节点都被访问为止。以下是一个使用C语言实现BFS的示例代码: ``` #include <stdio.h> #include <stdbool.h> #define MAX_NODES 100 bool visited[MAX_NODES]; int queue[MAX_NODES]; int front = 0, rear = 0; void bfs(int graph[][MAX_NODES], int nodes, int start) { visited[start] = true; queue[rear++] = start; while (front < rear) { int curr = queue[front++]; printf("%d ", curr); for (int i = 0; i < nodes; i++) { if (graph[curr][i] && !visited[i]) { visited[i] = true; queue[rear++] = i; } } } } int main() { int graph[MAX_NODES][MAX_NODES]; int nodes, edges, start; // 读入图的节点数、边数和起点 scanf("%d %d %d", &nodes, &edges, &start); // 初始化邻接矩阵 for (int i = 0; i < nodes; i++) { for (int j = 0; j < nodes; j++) { graph[i][j] = 0; } } // 读入图的边并构建邻接矩阵 for (int i = 0; i < edges; i++) { int u, v; scanf("%d %d", &u, &v); graph[u][v] = graph[v][u] = 1; } // 初始化visited数组 for (int i = 0; i < nodes; i++) { visited[i] = false; } // 调用BFS函数 bfs(graph, nodes, start); return 0; } ``` 以上代码中,`graph` 是一个邻接矩阵,用于存储图的边信息。`visited` 数组用于记录每个节点是否被访问过。`queue` 数组用于存储待访问的节点。BFS算法的核心是 `bfs` 函数,它从起点 `start` 开始遍历图。在遍历过程中,每访问一个节点都将其标记为已访问,并将其相邻的未访问节点加入队列。在队列中,先加入的节点先被访问,保证了按照距离递增的顺序遍历图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若亦_Royi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值