深度优先遍历与广度优先遍历的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度优先遍历与广度优先遍历的区别相关的知识,希望对你有一定的参考价值。
一、指代不同
1、深度优先遍历:是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
2、广度优先遍历:系统地展开并检查图中的所有节点,以找寻结果。
二、特点不同
1、深度优先遍历:所有的搜索算法从其最终的算法实现上来看,都可以划分成两个部分──控制结构和产生系统。正如前面所说的,搜索算法简而言之就是穷举所有可能情况并找到合适的答案,所以最基本的问题就是罗列出所有可能的情况,这其实就是一种产生式系统。
2、广度优先遍历:并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
三、算法不同
1、深度优先遍历:把根节点压入栈中。每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。找到所要找的元素时结束程序。如果遍历整个树还没有找到,结束程序。
2、广度优先遍历:把根节点放到队列的末尾。每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。找到所要找的元素时结束程序。如果遍历整个树还没有找到,结束程序。
参考资料来源:百度百科-广度优先遍历
参考资料来源:百度百科-深度优先遍历
参考技术A 一、指代不同1、深度优先遍历:是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
2、广度优先遍历:系统地展开并检查图中的所有节点,以找寻结果。
二、特点不同
1、深度优先遍历:所有的搜索算法从其最终的算法实现上来看,都可以划分成两个部分──控制结构和产生系统。正如前面所说的,搜索算法简而言之就是穷举所有可能情况并找到合适的答案,所以最基本的问题就是罗列出所有可能的情况,这其实就是一种产生式系统。
2、广度优先遍历:并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
三、算法不同
1、深度优先遍历:把根节点压入栈中。每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。找到所要找的元素时结束程序。如果遍历整个树还没有找到,结束程序。
2、广度优先遍历:把根节点放到队列的末尾。每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。找到所要找的元素时结束程序。如果遍历整个树还没有找到,结束程序。 参考技术B 深度优先遍历与广度优先遍历是图遍历的算法(不明白好好研究一下数据结构图遍历那一章)。
深度优先遍历从某个顶点出发,首先访问这个顶点,然后找出刚访问这个结点的第一个未被访问的邻结点,然后再以此邻结点为顶点,继续找它的下一个新的顶点进行访问,重复此步骤,直到所有结点都被访问完为止。
广度优先遍历从某个顶点出发,首先访问这个顶点,然后找出这个结点的所有未被访问的邻接点,访问完后再访问这些结点中第一个邻接点的所有结点,重复此方法,直到所有结点都被访问完为止。
可以看到两种方法最大的区别在于前者从顶点的第一个邻接点一直访问下去再访问顶点的第二个邻接点;后者从顶点开始访问该顶点的所有邻接点再依次向下,一层一层的访问。本回答被提问者采纳 参考技术C 一个向下…一个从左到右
图的深度优先遍历与广度优先遍历
描述
给出一个无向图顶点和边的信息,输出这个无向图的深度优先遍历序列和广度优先遍历序列。从一个顶点出发如果有2个以上的顶点可以访问时,我们约定先访问编号大的那个顶点。示例输入对应的图如下图所示:
####输入 输入的第1行有2个整数m和n。表示图g有m个顶点和n条边。 第2行是m个以空格隔开的字符串,依次是图中第1个顶点的名字,第2个顶点的名字.....第m个顶点的名字。 此后还有n行,每行由2个字符串构成,分别是构成图中1条边的两个顶点。我们约定不会有重边。 ####输出 输出有2行。 第1行是从第1个顶点出发对图g做深度优先遍历得到的顶点序列。 第2行是从第1个顶点出发对图g做广度优先遍历得到的顶点序列。 ####样例输入8 9 v1 v2 v3 v4 v5 v6 v7 v8 v1 v2 v1 v3 v1 v6 v2 v3 v2 v4 v3 v4 v4 v6 v5 v6 v7 v8####样例输出
v1 v6 v5 v4 v3 v2 v7 v8 v1 v6 v3 v2 v5 v4 v7 v8####提示 注意:从一个顶点出发如果有2个以上的顶点可以访问时,我们约定先访问编号大的那个顶点。 ps:注意提示内容,输出方式!!!!,然后正常做就ok ####完整代码 ```c #include
using namespace std;
int visited[MAX_SIZE] = {0};
typedef struct ANode
{
int adjvex;
struct ANode *nextarc;
}AreNode;
typedef struct Vnode
{
char info[MAX_LEN];
AreNode *firstarc;
}VNode;
typedef struct
{
VNode adjlist[MAX_SIZE];
int n, e;
}AdjGraph;
void init_visited_mess(AdjGraph g)
{
memset(visited,g->n,UNVISITED);
}
void CreatGraph(AdjGraph &g, int n, int e)
{
char vex[MAX_LEN], nextarc[MAX_LEN];
int i, j;
g = (AdjGraph) malloc (sizeof(AdjGraph));
g->n = n;
g->e = e;
for (i = 1; i <= n; i++) {
scanf("%s ",g->adjlist[i].info);
g->adjlist[i].firstarc = NULL;
}
while (e--) {
AreNode nex;
scanf("%s %s",vex,nextarc);
for (i = 1; i <= n; i++)
if (strcmp(g->adjlist[i].info,vex)0) break;
for (j = 1; j <= n; j++)
if (strcmp(g->adjlist[j].info,nextarc)0) break;
nex = (AreNode) malloc (sizeof(AreNode));
nex->adjvex = j;
nex->nextarc = g->adjlist[i].firstarc;
g->adjlist[i].firstarc = nex;
nex = (AreNode) malloc (sizeof(AreNode));
nex->adjvex = i;
nex->nextarc = g->adjlist[j].firstarc;
g->adjlist[j].firstarc = nex;
}
}
void DisplayGraph(AdjGraph *g)
{
int i;
AreNode p;
for (i = 1; i <= g->n; i++) {
p = g->adjlist[i].firstarc;
printf("%3s: ",g->adjlist[i].info);
while (NULL != p) {
printf("%3s ",g->adjlist[p->adjvex].info);
p = p->nextarc;
}
printf("
");
}
}
AreNode find_nextarc_max_adjvex(AdjGraph *g, int adjvex)
{
AreNode *p;
p = g->adjlist[adjvex].firstarc;
int max_adjvex = 0;
while (NULL != p) {
if (visited[p->adjvex] == UNVISITED)
max_adjvex = max_adjvex > p->adjvex ? max_adjvex : p->adjvex;
p = p->nextarc;
}
p = g->adjlist[adjvex].firstarc;
while (NULL != p) {
if (p->adjvex == max_adjvex) break;
p = p->nextarc;
}
if (max_adjvex == adjvex) p = NULL;
return p;
}
// int find_nextarc_max_adjvex(AdjGraph *g, int adjvex)
// {
// AreNode *p;
// p = g->adjlist[adjvex].firstarc;
// int max_adjvex = 0;
// while (NULL != p) {
// if (visited[p->adjvex] == UNVISITED)
// max_adjvex = max_adjvex > p->adjvex ? max_adjvex : p->adjvex;
// p = p->nextarc;
// }
// return max_adjvex;
// }
void DFS_connected_graph(AdjGraph *g, int adjvex)
{
int nex_adj;
AreNode *p;
printf("%s ",g->adjlist[adjvex].info);
visited[adjvex] = VISITED;
p = find_nextarc_max_adjvex(g,adjvex);
while (NULL != p) {
if (visited[p->adjvex] == UNVISITED) DFS_connected_graph(g,p->adjvex);
p = p->nextarc;
}
}
void DFS(AdjGraph *g)
{
int i;
for (i = 1; i <= g->n; i++)
if (visited[i] == UNVISITED) DFS_connected_graph(g,i);
memset(visited,UNVISITED,MAX_SIZE);
}
void BFS_connected_graph(AdjGraph *g, int adjvex)
{
int top_adjvex, i;
AreNode *p;
queue
printf("%s ",g->adjlist[adjvex].info);
visited[adjvex] = VISITED;
nextarcs.push(adjvex);
while (!nextarcs.empty()) {
top_adjvex = nextarcs.front();
nextarcs.pop();
p = find_nextarc_max_adjvex(g,top_adjvex);
while (NULL != p) {
if (visited[p->adjvex] == UNVISITED) {
printf("%s ",g->adjlist[p->adjvex].info);
visited[p->adjvex] = VISITED;
nextarcs.push(p->adjvex);
}
p = find_nextarc_max_adjvex(g,top_adjvex);
}
}
}
void BFS(AdjGraph *g)
{
int i;
for (i = 1; i <= g->n; i++)
if (visited[i] == UNVISITED) BFS_connected_graph(g,i);
memset(visited,UNVISITED,MAX_SIZE);
}
int main(int argc, char const *argv[])
{
AdjGraph *g;
int n,m;
cin >> n >> m;
CreatGraph(g,n,m);
// DisplayGraph(g);
DFS(g); cout << endl;
BFS(g);
system("pause");
return 0;
}
以上是关于深度优先遍历与广度优先遍历的区别的主要内容,如果未能解决你的问题,请参考以下文章