图的宽度优先遍历

Posted 爱敲代码的Harrison

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的宽度优先遍历相关的知识,希望对你有一定的参考价值。

大家好,我是一名计算机专业的大三在校生,自不量力想明年秋招进大厂BATJMZ💪💪💪。由于大学里面荒废了两年😔,所以决定从此刻开始改变。希望通过写博客记录自己学习和成长的历程;同时也能够增长见识,学习到更多的知识,遇见更多志同道合的人🤝🤝🤝。本人目前还只是个青铜,希望和我的读者朋友们可以共同进步,一起探讨。如果我的文章能够帮到你的话,那实在是我的幸运,也希望我写的博客内容能够帮助一些在编程方面有问题的朋友。在这里如果你发现我写的有哪些不对或不足之处,请您谅解。你可以及时评论或私信来告诫我,我会积极采纳改正的,我会努力提升博客文章的质量。如果可以给个三连,那真是十分感谢,🙇‍🙇‍🙇‍

二叉树的宽度优先遍历只用到了队列,不清楚的朋友可以看看这篇文章二叉树的按层遍历。但是图还需要HashSet,因为二叉树不会有环的问题。二叉树进行宽度优先遍历的时候,一个结点不会多次进入队列,而图有可能。所以准备一个HashSet。HashSet就是保证每个结点只进一次队列。

从某个结点出发,假设是X,离X结点最近的一层结点先遍历,再是遍历离X距离两层的结点,接着往下…但是同一层内部具体的遍历顺序没有要求。队列弹出的时候,弹出就打印,然后遍历弹出结点的所有直接邻居,没有在HashSetl里的结点才可以加入队列和HashSet。

注意:队列和HashSet是同步加入的!!!

package com.harrison.class11;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;

import com.harrison.class11.Code01_NodeEdgeGraph.Node;

public class Code02_BFS 
	// 从node出发,进行宽度优先遍历,只需要用到点结构
	public static void bfs(Node node) 
		if (node == null) 
			return;
		
		Queue<Node> queue = new LinkedList<>();
		// 在二叉树进行宽度优先遍历时不会形成环
		// 但图会形成环,所以必须有个机制来确保每个结点只进一次队列
		HashSet<Node> set = new HashSet<>();
		queue.add(node);
		set.add(node);
		while (!queue.isEmpty()) 
			Node cur = queue.poll();
			System.out.println(cur.value);
			// 遍历当前结点的所有直接后继
			// 如果set中没有才加入set和队列
			for (Node next : node.nexts) 
				if (!set.contains(next)) 
					set.add(next);
					queue.add(next);
				
			
		
	


宽度优先遍历只需要用到点结构就可以实现,所以表示图的方式很重要。这篇文章实现图的方式就很合适,推荐大家看看——图结构的实现,从点到边再到图

最后再总结一下,宽度优先遍历的流程:

1)利用队列实现

2)从源节点开始依次按照宽度进队列,然后弹出

3)每弹出一个点,把该节点所有没有进过队列的邻接点放入队列

4)直到队列变空

以上是关于图的宽度优先遍历的主要内容,如果未能解决你的问题,请参考以下文章

算法笔记图结构及图的 DFS 和 BFS 介绍

Python数据结构-队列与广度优先搜索(Queue)

求图的深度优先遍历程序 c语言版

Graph 感悟

图的深度优先遍历DFS和广度优先遍历BFS(邻接矩阵存储)超详细完整代码进阶版

Java实现无向图的邻接列表表示,深度遍历及广度遍历