深度优先遍历和广度优先遍历

这篇具有很好参考价值的文章主要介绍了深度优先遍历和广度优先遍历。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先来看一下两者之间的区别:

深度优先遍历(简称DFS):就是先选择一条路尽可能深入,走到头(即该点没有未被访问过的相邻节点)再回退到上一个节点,继续探索该节点的其他支路,就该支路继续深入的遍历方法

以示例作参考

先选择一条作为深度优先遍历首次探索到的支路

深度优先和广度优先遍历,深度优先,宽度优先

 探索到6节点,发现6节点周围没有未被探索到的节点,回退到5节点

深度优先和广度优先遍历,深度优先,宽度优先

5节点周围也没有未被探索到的节点,回退到3节点

深度优先和广度优先遍历,深度优先,宽度优先

此时,3节点周围的4节点未被访问,探索4节点

 深度优先和广度优先遍历,深度优先,宽度优先

探索到4节点后,发现4节点周围也没有未被访问过的节点,继续回退到3节点

深度优先和广度优先遍历,深度优先,宽度优先

 此时,发现3节点周围也没有未被访问过的节点,继续回退到0节点

深度优先和广度优先遍历,深度优先,宽度优先

回退到0节点后,发现2节点未被访问过,继续探索2节点的支路,以此类推,直到所有结点都被访问过完毕

深度优先和广度优先遍历,深度优先,宽度优先

来看一下代码怎么写

由以上示例得知,实现深度优先遍历的关键在于回溯 ,自后向前,追溯曾经走过的路径。想实现回溯,我们可以利用栈的先进后出的特性,也可以采用递归的方式。

首先将节点0,3,5,6入栈,此时栈顶是6

深度优先和广度优先遍历,深度优先,宽度优先

从节点6退回到节点5,节点6出栈,此时栈顶是5

深度优先和广度优先遍历,深度优先,宽度优先

从节点5退回到节点3,节点5出栈,栈顶变为3,节点3周围有节点4未被访问,节点4入栈

 深度优先和广度优先遍历,深度优先,宽度优先

 从节点4与退回到节点3,节点4出栈,

深度优先和广度优先遍历,深度优先,宽度优先

 从节点3回退到节点0,3出栈,依次类推,实现回溯,最终遍历完所有顶点。

其实,我们学习过的前序遍历,后序遍历中序遍历的思想与DFS的思想是类似的。

#include<stdio.h>
#include<stack>
#define MAX 100
using namespace std;

typedef struct
{
    int e[MAX][MAX];
    int ves;
    int edge;
    int book[MAX];//标志判断是否有被访问过 
}MGraph;

void createMGraph(MGraph *G)
{
    int i;
    int j;
    int start;
    int end;

    printf("please input the ves and edge:\n");
    scanf("%d %d",&G->ves,&G->edge);
//初始化
    for(i = 0; i < G->ves; i++)
    {
        for(j = 0; j < G->ves; j++)
            G->e[i][j] = 0;
        G->book[i] = 0;//没被访问过的结点置为0 
    }
//创建邻接矩阵 
    printf("please input the (vi,vj)\n");
    for(i = 0; i < G->edge; i++)
    {
        scanf("%d %d",&start,&end);
        G->e[start][end] = 1;
    }
}

void dfs(MGraph* G,int ves)
{
   stack<int> s;//创建一个栈
   printf("%d ", ves);

   G->book[ves] = 1;//已经访问过结点ves了
   s.push(ves);//入栈

   while(!s.empty())
   {
       int data, i;

       data = s.top();//取top的顶点
       for(i = 0; i < G->ves; i++)
       {
           if(G->e[data][i] != 0 && G->book[i] != 1)
       	   {
           printf("%d ", i);
           G->book[i] = 1;
           s.push(i);
           break;// 开始遍历下一个点的邻接矩阵表
      	   }
       }
       if(i == G->ves)//data相邻的结点都访问结束了,就弹出data
       {
           s.pop();
       }
   }
}

int main()
{
    MGraph G;
    createMGraph(&G);
    dfs(&G,0);
    return 0;
}

广度优先遍历(简称BFS):又叫层次遍历,从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。是由内到外的,层层递进的一种遍历方法。

示例:

我们以节点0为起始节点

深度优先和广度优先遍历,深度优先,宽度优先

然后,我们再探索与节点0相邻的节点1,7,2,3

深度优先和广度优先遍历,深度优先,宽度优先

接着,我们探索与节点0相隔了一层的节点8,4,5

深度优先和广度优先遍历,深度优先,宽度优先

然后,再次探索,与节点0相隔了两层的节点6

深度优先和广度优先遍历,深度优先,宽度优先

至此,所有节点探索完毕。

来看一下代码怎么写

由以上示例得知,实现深度优先遍历的关键在于重放,按照广度优先遍历的思想,我们首先遍历顶点0,然后接着遍历顶点1,7,2,3,接下来我们要遍历更外围的顶点,可是如何找到这些更外围的顶点呢?我们需要把刚才遍历过的顶点1、2、3、7按顺序重新回顾一遍,从顶点1发现邻近的顶点8;从顶点3发现邻近的顶点4、5。

首先将节点0入队

 深度优先和广度优先遍历,深度优先,宽度优先

接下来顶点0出队,遍历顶点0的邻近顶点1,7,2,3,并且把它们入队:

 深度优先和广度优先遍历,深度优先,宽度优先

然后节点1出队,遍历节点1附件的节点8,节点8入队

深度优先和广度优先遍历,深度优先,宽度优先

接下来节点7出队,遍历节点7周围节点,发现无节点入队,则继续节点2出队,遍历节点2周围节点,发现无节点入队,继续向后出队

 深度优先和广度优先遍历,深度优先,宽度优先

然后节点3出队,遍历节点1附件的节点4,5,节点4,5入队

 深度优先和广度优先遍历,深度优先,宽度优先

继续,以此类推,将一个节点出队,就将它周围的节点入队,直到所有的节点出队完毕,遍历完成

#include<iostream>
using namespace std;
const int n = 11;//结点个数
const int SIZE = 10;
class queue
{
private:
	int buffer[SIZE];
	int rear, head;//rear指向队尾元素,front指向队列前一格
	int update(int value) { return (value + 1) % SIZE; }
public:
	queue():head(0),rear(0){}
	bool queueNull() { return rear == head;}//队空队尾下标和队首下标相同
	bool queueMax() { return update(rear) == head; } //队满
	bool queueAdd(int E)
	{
		if (queueMax()) return false;
		rear = update(rear);
		buffer[rear] = E;
		return true;
	}
	bool getFirstQueue(int& E)
	{
		if (queueNull()) return false;
		head = update(head);
		E = buffer[head];
		return true;
	}
};

bool flag[n];
void BreadthFirstSearch(int begin)
{
	for (int i = 0; i < n; i++) flag[i] = false;
	queue que;//创建队列对象
	que.queueAdd(begin);
	flag[begin] = true;
	int node;
	while (!que.queueNull())
	{
		que.getFirstQueue(node);
		cout << node << ",";
		for (int i=0;i<n;i++)
		{
			if (nextClose[node][i] && !flag[i])
			{
				que.queueAdd(i);
				flag[i] = true;
			}
		}
	}
}
int main()
{   
    const bool F=false,T=ture;
    int n;
    bool nextClose[100][100];
    for(int i=0;i<n;i++){
      for(int j=0;j<n;j++)
    {
      bool b;
      cin>>b;
      nextClose[i][j]=b;
      }
}
	BreadthFirstSearch(0);
	cout << "Hello World" << endl;
}

 谢谢观看,如果有不足之处,敬请谅解。文章来源地址https://www.toymoban.com/news/detail-753426.html

到了这里,关于深度优先遍历和广度优先遍历的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【图】概念、存储结构、广度优先遍历遍历、深度优先遍历 - 详解

    目录 前言 一、图 1.1、基本概念 二、图的存储结构 2.1、存储结构 2.1、邻接矩阵(考察重点) 2.1.1、代码实现 2.2、邻接表 2.3.1、无向邻接表存储 2.3.2、有向图邻接表存储 3.1、图的广度优先遍历(层序遍历) 3.2、图的深度优先遍历 本章主要讲的是图的基本概念以及应用,面试

    2024年02月08日
    浏览(51)
  • 图的二种遍历-广度优先遍历和深度优先遍历

    1.树的广度优先遍历 这样一个图中,是如何实现广度优先遍历的呢,首先,从1遍历完成之后,在去遍历2,3,4,最后遍历5 ,6 , 7  , 8。这也就是为什么叫做广度优先遍历,是一层一层的往广的遍历 不存在“回路”,搜索相邻的结点时,不可能搜到已经访问过的结点 树的广度优

    2024年02月02日
    浏览(50)
  • 构造无向图,进行深度优先遍历和广度优先遍历

    一. 实验要求 实现利用邻接矩阵构造无向图的算法,在此基础上进行深度优先遍历和广度优先遍历。 二. 实验目的 通过该实验,使学生掌握图的几种存储结构,理解图的深度优先和广度优先遍历算法的思想和实现办法 三、设计思想 1.创建网图。网图是利用邻接矩阵来存储的

    2024年02月05日
    浏览(38)
  • 图的遍历(广度优先遍历BFS,深度优先遍历DFS)

    目录 图的遍历概念: 图的广度优先遍历(BFS): 代码实现如下: 测试如下: 注意: 图的深度优先遍历(DFS): 代码实现如下: 测试如下: 总代码: 结语: 给定一个图G和其中任意一个顶点v0,从v0出发,沿着图中各边访问图中的所有顶点,且每个顶点仅被遍历一次。\\\"遍

    2024年02月21日
    浏览(56)
  • 图的遍历-深度优先遍历与广度优先遍历(C语言)

    图的遍历 概念:指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。 邻接矩阵及邻接表的创建 : 图的存储结构-无向邻接矩阵与无向邻接表(C语言). 结构定义 邻接矩阵的深度优先遍历操作 邻接矩阵的深度优先递归算法 结构定义 邻接表的深度优先遍

    2024年02月06日
    浏览(48)
  • 图用邻接矩阵实现,深度优先遍历和广度优先遍历

    邻接矩阵的结构体 邻接矩阵图的建立         图的建立有多种实现方式,我这里是从键盘输入顶点数,边条数,并从键盘输入边的关系 图是带有权值的,并且把环的权值赋值为0,两个顶点没有边权值为32767。 查找顶点v,并且返回v的相关信息         通过循环去找顶点,如

    2024年02月04日
    浏览(46)
  • C++构造无向图,邻接矩阵,深度优先遍历,广度优先遍历

    目录 定义无向图邻接矩阵 构造无向图 打印邻接矩阵 无向图邻接矩阵深度优先遍历(DFS) 无向图邻接矩阵广度优先遍历(BFS) 测试  完整代码 定义无向图邻接矩阵 构造无向图 1、输入总顶点数和总边数 2、依次输入顶点信息存入顶点表 3、 初始化邻接矩阵,使每个权值初始化

    2024年02月06日
    浏览(82)
  • 大话数据结构-图的深度优先遍历和广度优先遍历

      图的遍历分为深度优先遍历和广度优先遍历两种。   深度优先遍历(Depth First Search),也称为深度优先搜索,简称DFS,深度优先遍历,是指从某一个顶点开始,按照一定的规则,访问并记录下一个未访问顶点。对于非连通图,则是按连通分量,采用同一规则进行深度优

    2024年02月04日
    浏览(58)
  • 二叉树层级遍历(深度优先、广度优先算法)

    中等难度 思路和算法 我们可以用广度优先搜索解决这个问题。 我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数,每个新进队列的节点的 level 值都是父亲节点的 level 值加一。最后根据每个点的 level 对点进行分类,分类的时

    2024年02月09日
    浏览(38)
  • 邻接表按深度优先遍历和按广度优先遍历的序列

    求此邻接表的深度优先遍历序列和广度优先遍历序列。   深度优先:按深度优先遍历时会有类似\\\"跳转\\\"的操作,比如例1中顶点v1→边v2后,会直接跳转到顶点v2去,再重新从顶点v2→边v1,由于v1访问过,所以变为v2→边v5,再跳转到顶点v5去,直到每个顶点都被访问过。抽象理解

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包