图的遍历 (深度优先遍历和广度优先遍历)

一. 什么是深度优先遍历

深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点为新的源点重复上述过程,直至图中所有的顶点均已被访问为止。

深度优先遍历结果是: A B E F C D G H 

    深度优先遍历尽可能优先往深层次进行搜索

二.广度优先遍历

广度优先遍历可定义如下:首先访问出发点v,接着依次访问v的所有邻接点w1、w2......wt,然后依次访问w1、w2......wt邻接的所有未曾访问过的顶点。以此类推,直至图中所有和源点v有路径相通的顶点都已访问到为止。此时从v开始的搜索过程结束。

 

 

广度优先遍历结果是: A B C D E F G H I

广度优先遍历按层次优先搜索最近的结点,一层一层往外搜索。

三. 创建的步骤 

    深度优先遍历创建步骤(Depth First Search)

 1.访问初始节点 v,并标记为已访问

 2.查找结点v的第一个邻接点 w

 3.若w存在   则执行4   若不存在回到第一步 再找 v结点的下一个结点

 4.判断w是否被访问   未访问对w深度优先遍历(即把w当作另一个v ,再进行1 2 3);

 5.查找v 在w 后面是否还有下一个邻接点   再执行步骤3 

  广度优先遍历步骤

(需要用到队列来实现对 顺序的访问他的所有邻接点)

 1.访问初始节点 v,并标记为已访问

 2.结点v 入队列

 3.当队列非空时 继续执行,否则结束

 4. 出队列 ,取得头结点u

 5. 查找结点u 的第一个邻接点w

6. 若结点u 邻接点不存在 则执行 步骤3 否则循环执行以下三个步骤

      6.1. 若结点w 未被访问 则访问节点w 并标记为已访问

      6.2 结点w 入队

      6.3 查找结点u的 除了w 之后的下一个其他邻接点

四. 代码实现

//深度优先遍历
		public void dfs(boolean [] isVisied,int i) {
			
			//传入是否被访问的数组  ,和第几个邻接点 
			System.out.printf(getVertexInf(i)+"-->");
			isVisied[i]=true;
			//查找i节点的第一个邻接点
			int f = getFirstNeighbor(i);
			while(f!=-1) {
				//表示第一个邻接点存在
				//判断是否被访问
				if(!isVisied[f]) {
				  dfs(isVisied, f);
				 } 
				//这个i 的下一个邻接点已经被访问了,再找这个节点的下一个结点
				f= getNextNeighbor(i,f);
			}
			
			
		}
	//对每个节点遍历
    //当一个节点访问完后 还有其他未访问的,利用循环 遍历所有的结点
		public void DFS() {
			isVisited= new boolean[getNumOfV()];
			for(int i=0;i<vertexList.size();i++){
				
				if(!isVisited[i]) {
					dfs(isVisited,i);
				}
			}
		}

 

//广度优先遍历   对第i个结点遍历  利用队列来实现
		public void bfs(boolean [] isVisied,int i) {
			int u;  //表示队列的第一个元素
			int w ;  //表示这个节点的邻接点
			LinkedList queue = new LinkedList(); //创建出队列
			
			 //调用这个方法就意味着 满足条件可以输出
			System.out.printf(getVertexInf(i)+"==>");
			//把这个结点置为i访问
			isVisied[i]=true;
			//将节点加入 到队列中
			queue.addLast(i);  //在队尾添加元素
			
			//循环判断队列是否还有元素
			while(!queue.isEmpty()) {
				//给第一个元素出队列
				u = (int) queue.removeFirst();
				//找这个元素的邻接点
				w = getFirstNeighbor(u);
				while(w!=-1) {
					//找到邻接点
					if(!isVisied[w]) {
						//判断是否已访问
						System.out.printf(getVertexInf(w)+"==>");
						//把这个结点置为i访问
						isVisied[w]=true;
						//将节点加入 到队列中
						queue.addLast(w);  //在队尾添加元素
					}
					//继续寻找下一个  广度的
					w = getNextNeighbor(u, w);
				}
			}
			
		}
		//对每个节点遍历
				public void BFS() {
					isVisited= new boolean[getNumOfV()];
					for(int i=0;i<vertexList.size();i++){
						
						if(!isVisited[i]) {
							bfs(isVisited,i);
						}
					}
				}
		

五. 结果展示

 

  • 24
    点赞
  • 238
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是小晴晴呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值