分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_图的BFS、DFS

BFS、DFS分别为广度优先搜索和深度优先搜索的英文首字母缩写。

先考虑树的BFS、DFS。

树的BFS即层序遍历。层序遍历先访问根结点,再逐个访问根结点的子结点,再逐个访问上述子结点的子结点,以此类推,直至访问过所有结点。

树的DFS有三种(先序遍历、中序遍历、后序遍历),这里只说先序遍历。先序遍历先访问根结点,再逐个先序遍历根结点的所有子树。(由递归的定义可知,容易用递归算法实现(函数的递归用到了调用栈,开销较大,所以性能较差)。也可以自定义一个栈实现非递归算法。)

789844aaf347656f1d49da3d68bed5d2.png
图1

图1中的树,按层序遍历的访问顺序为ABCDEFGH。按先序遍历的访问顺序为ABDEFCGH。(这里是把树当作有序树,以左边结点为优先。)

C++示例代码如下:

#include 

图的点之间关系是任意的,也就没有根结点和双亲、孩子、兄弟等概念。搜索可以从任意一个点开始,自然也要注意某个点是否已访问过。

图的BFS跟树的层序遍历类似,访问任意一个点,再逐个访问该点的邻接点,再逐个访问上述邻接点的邻接点,

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你解答这个问题。 首先,我们需要了解一下的基本概念。是一种抽象的数据结构,由节点(也称为顶点)和边组成。节点中的元素,边示节点之间的关系。根据边的方向,可以分为有向和无向;根据边的权重,可以分为带权和无权邻接矩阵邻接是两种的方式。邻接矩阵是一个二维数组,其中第i行第j列的元素示节点i和节点j之间是否存在边。如果存在边,则该元素的值为1或者边的权重;否则,该元素的值为0或者无穷大。邻接是由节点和与之相邻的节点列组成的序列。具体而言,每个节点都对应一个链,链中存储该节点所连接的其他节点以及边的权重。 接下来,我们可以使用邻接矩阵邻接创建一个,并对这个进行深度优先广度优先。假设我们要创建一个无向,其中包含5个节点和6条边,则邻接矩阵邻接分别如下所示: 邻接矩阵: ``` 0 1 2 3 4 0 0 1 1 0 0 1 1 0 1 1 0 2 1 1 0 1 1 3 0 1 1 0 1 4 0 0 1 1 0 ``` 邻接: ``` 0 -> 1 -> 2 1 -> 0 -> 2 -> 3 2 -> 0 -> 1 -> 3 -> 4 3 -> 1 -> 2 -> 4 4 -> 2 -> 3 ``` 接下来,我们可以对这个进行深度优先广度优先深度优先DFS)可以通过递归或栈来实现。其基本思路是从起点开始,访问一个相邻节点,然后再访问该节点的相邻节点,直到无法访问为止。然后回溯到上一个节点,访问其未访问的相邻节点。重复上述过程,直到遍完所有节点。 广度优先BFS)可以通过队列来实现。其基本思路是从起点开始,访问其相邻节点,并将这些节点加入队列中。然后从队列中取出一个节点,访问其相邻节点,并将这些节点加入队列中。重复上述过程,直到队列为空。 以邻接为例,下面是深度优先广度优先的代码实现: ``` // 邻接深度优先 vector<bool> visited(N, false); // N为节点数 void dfs(vector<vector<int>>& graph, int node) { visited[node] = true; // 标记节点已访问 cout << node << " "; // 输出节点值 for (int neighbor : graph[node]) { if (!visited[neighbor]) { dfs(graph, neighbor); // 递归访问相邻节点 } } } // 邻接广度优先 void bfs(vector<vector<int>>& graph, int node) { vector<bool> visited(N, false); queue<int> q; q.push(node); // 将起点加入队列 visited[node] = true; // 标记节点已访问 while (!q.empty()) { int cur = q.front(); q.pop(); cout << cur << " "; // 输出节点值 for (int neighbor : graph[cur]) { if (!visited[neighbor]) { q.push(neighbor); // 将相邻节点加入队列 visited[neighbor] = true; // 标记节点已访问 } } } } ``` 希望这个回答能够帮助你解决问题!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值