图的宽度优先遍历

简介: 图的宽度优先遍历

大家好,我是一名计算机专业的大三在校生,自不量力想明年秋招进大厂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)直到队列变空


相关文章
|
9月前
|
Python
课时36:非布尔值的逻辑运算符
本文主要围绕Python中对非布尔值进行与或运算的情况展开,详细介绍了其运算规则,并通过实例演示加深理解,随后引入了最后一种运算符——条件运算符(三元运算符),即将对其语法进行讲解。 1.非布尔值的与运算 2.非布尔值与运算规则总结 3.非布尔值的或运算 4.非布尔值或运算规则总结 5.条件运算符(三元运算符)介绍
148 9
|
存储 内存技术
华为VRP系统
华为VRP系统
|
SQL 缓存 PHP
PHP编程中的性能优化技巧
【10月更文挑战第42天】在Web开发的世界里,PHP以其易用性和灵活性广受欢迎。但随之而来的性能问题也不容忽视。本文将探讨一些实用的PHP性能优化技巧,帮助开发者编写更高效、响应更快的代码。从减少不必要的计算到优化数据库查询,这些建议将引导你走向更流畅的PHP编码之旅。
134 0
|
机器学习/深度学习 存储 API
2.2 通过极简方案实现数字识别任务
这篇文章通过极简方案快速实现了基于飞桨的手写数字识别任务,涵盖了数据加载、模型设计、训练配置、训练过程和模型测试等步骤,并指出了当前模型的局限性,同时提出了进一步优化模型的思考方向。
|
Java Spring
SpringBoot 开启事务Spring事务常用
SpringBoot 开启事务Spring事务常用
117 0
|
JSON 数据格式 Python
Python生成JSON数据
Python生成JSON数据
303 0
|
存储 缓存 算法
一文打通java中内存泄露
一文打通java中内存泄露
|
算法 Java Android开发
LinearLayout(线性布局)
本节开始讲Android中的布局,今天我们要讲解的就是第一个布局,LinearLayout(线性布局),我们屏幕适配的使用用的比较多的就是LinearLayout的weight(权重属性),在这一节里,我们会详细地解析LinearLayout,包括一些基本的属性,Weight属性的使用,以及比例如何计算,另外还会说下一个用的比较少的属性:android:divider绘制下划线!
199 0
|
JSON 数据可视化 Android开发
HarmonyOS(鸿蒙)——config.json详解
HarmonyOS(鸿蒙)——config.json详解
1089 0
HarmonyOS(鸿蒙)——config.json详解
|
JSON 缓存 JavaScript
.NET微信网页开发之JS-SDK使用步骤和配置信息timestamp(时间戳),nonceStr(随机串),signature(签名),access_token(接口调用凭据)的生成获取详解
.NET微信网页开发之JS-SDK使用步骤和配置信息timestamp(时间戳),nonceStr(随机串),signature(签名),access_token(接口调用凭据)的生成获取详解
866 0
.NET微信网页开发之JS-SDK使用步骤和配置信息timestamp(时间戳),nonceStr(随机串),signature(签名),access_token(接口调用凭据)的生成获取详解