Java实现广度优先遍历的示例详解

Java实现广度优先遍历的示例详解

什么是广度优先遍历

广度优先遍历(Breadth First Search, BFS)是一种图形的遍历算法,其遍历能力基于层次高效地访问相邻节点,并按顺序访问节点。这种方式即宽度优先,图形遍历的起点为根节点,相关的数据结构是队列。

广度优先遍历的应用

广度优先遍历算法在许多领域都有应用,比如:

  • 寻找最短路径
  • 二叉树搜索
  • 网络路由算法
  • 解决 谷仓机器人 题目

广度优先遍历的实现

可以通过迭代方法实现广度优先遍历,采用队列结构进行节点遍历。

例如下面这个二叉树:

    5
  /  \
 4    6
/ \    \

2 3 7

示例1:Java代码示例

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

class Node {
    int value;
    Node left;
    Node right;
}

public class BFS {

    public void bfs(Node root) {
        if (root == null)
            return;
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);
        Node node;
        while (!queue.isEmpty()) {
            node = queue.poll();
            System.out.print(node.value + " ");
            if (node.left != null) {
                queue.add(node.left);
            }
            if (node.right != null) {
                queue.add(node.right);
            }
        }
    }

    public static void main(String[] args) {
        Node root = new Node();
        root.value = 5;
        Node node1 = new Node();
        node1.value = 4;
        Node node2 = new Node();
        node2.value = 6;
        Node node3 = new Node();
        node3.value = 2;
        Node node4 = new Node();
        node4.value = 3;
        Node node5 = new Node();
        node5.value = 7;
        root.left = node1;
        root.right = node2;
        node1.left = node3;
        node1.right = node4;
        node2.right = node5;
        new BFS().bfs(root);
    }
}

输出:

5 4 6 2 3 7

示例2:使用队列实现谷仓机器人题目中的广度优先遍历问题

题目描述:In a RxC matrix, every cell of which is either containing ‘’ or a ‘X’. Given a starting point and a ending point, every cell containing ‘’ can be destroyed by placing a bomb at the cell. Implement an efficient algorithm to destroy all ‘*’ possible cells.

解法:使用队列实现广度优先搜索,每一步把周围为‘’的点加入队列,不断处理,直至队列为空或者所有 '' 都已经小心地处理了。这个题目可以通过广度优先搜索来解决。

Java代码示例:

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

public class DestroyAllStars {

    static class Point {
        int x;
        int y;

        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

    static char[][] map = {
            {'*', 'X', '*', 'X', '*', '*', 'X'},
            {'*', 'X', '*', 'X', '*', 'X', '*'},
            {'X', '*', '*', '*', '*', '*', 'X'},
            {'*', 'X', '*', 'X', '*', '*', 'X'},
            {'*', '*', '*', '*', '*', 'X', '*'}
    };

    public static void main(String[] args) {
        Queue<Point> queue = new LinkedList<>();
        boolean[][] visited = new boolean.length];
        queue.offer(new Point(0, 0));
        while (!queue.isEmpty()) {
            Point p = queue.poll();
            visited[p.x][p.y] = true;
            for (int i = -1; i <= 1; i++) {
                for (int j = -1; j <= 1; j++) {
                    int x = p.x + i;
                    int y = p.y + j;
                    if (x >= 0 && x < map.length && y >= 0 && y < map[0].length && map[x][y] == '*' && !visited[x][y]) {
                        queue.offer(new Point(x, y));
                        visited[x][y] = true;
                        map[x][y] = 'X';
                    }
                }
            }
        }
        printMap(map);
    }

    private static void printMap(char[][] map) {
        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j < map[0].length; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
    }

}

输出:

X X X X X X X 
X X X X X X X 
X X X X X X X 
X X X X X X X 
X X X X X X X

总结

广度优先遍历是一种基于层级遍历的算法,遍历的起点为根节点,遍历的过程中需要基于队列结构按照先入先出的原则来访问节点。在实际编程中,可以通过队列结构来实现广度优先遍历,其应用场景包括寻找最短路径、二叉树搜索、网络路由算法等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现广度优先遍历的示例详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • spring-boot-plus V1.4.0发布 集成用户角色权限部门管理(推荐)

    Spring Boot Plus V1.4.0发布 Spring Boot Plus是一个基于SpringBoot的项目快速开发脚手架,版本 V1.4.0 提供了用户角色权限部门管理的集成,方便用户快速搭建管理后台。 安装 首先,我们需要安装Java和Maven,参考:- Java 安装教程- Maven 安装教程 Spring Boot Plus 是通过M…

    Java 2023年5月20日
    00
  • Java零基础精通方法篇

    Java零基础精通方法篇攻略 Java作为一门在现代编程界十分流行的语言,其学习曲线也是比较陡峭的。学习方法很重要,下面是一些针对Java零基础学习的方法。 1. 确定学习路线 Java语言许多知识点非常广泛,在学习Java之前,了解和确定自己所要学习的路线非常重要。建议先学习Java基本语法,然后跟随Java的应用功能,例如网络编程、GUI编程、并发等。同…

    Java 2023年5月23日
    00
  • Java如何实现字符串每隔4位加空格

    Java如何实现字符串每隔4位加空格,可以通过如下方式实现: 1.使用正则表达式 Java中可以使用正则表达式对字符串进行匹配和替换。我们可以使用正则表达式来定义每四个字符后需要加上一个空格。 具体的代码实现如下: public String addSpace(String str) { return str.replaceAll("(.{4})&…

    Java 2023年5月26日
    00
  • Java开发基础日期类代码详解

    Java开发基础日期类代码详解 在Java开发中,经常需要处理日期和时间相关的数据。为了方便处理日期和时间,Java提供了一些日期类。这些日期类可以帮助我们实现日期格式化、日期比较、日期计算等操作。本文将详细讲解Java日期类的使用方法,包括如何创建日期对象、如何进行日期格式化和解析、如何比较日期、如何计算日期等。 如何创建日期对象 Java中有多种日期类,…

    Java 2023年5月20日
    00
  • java二叉树的数据插入算法介绍

    Java二叉树的数据插入算法介绍 二叉树是一种非常重要的数据结构,其具有高效的数据插入、查找、删除等特性。本文将介绍Java中二叉树的数据插入算法,希望能为Java开发者提供一些帮助。 什么是二叉树 二叉树是一种树形结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。如果某个节点没有子节点,则称其为叶子节点。二叉树的每个节点都存储了一个关键字和一…

    Java 2023年5月26日
    00
  • springboot 2.x整合mybatis实现增删查和批量处理方式

    下面是“springboot 2.x整合mybatis实现增删查和批量处理方式”的完整攻略。 准备工作 在开始整合之前,需要确保已经添加了Spring Boot和MyBatis的依赖。 先来看一下pom.xml文件: <dependencies> <!–Spring Boot相关依赖–> <dependency> &l…

    Java 2023年5月20日
    00
  • Spring Boot 启动、停止、重启、状态脚本

    Spring Boot启动、停止、重启、状态脚本的完整攻略 Spring Boot是一个非常流行的Java Web框架,它提供了许多方便的功能,如自配置、快速开发和易于部署。在本文中,我们将介绍如何编写Spring Boot的启动、停止、重启和状态脚本,并提供两个示例。 示例一:使用systemd编写脚本 systemd是一个Linux系统的初始化系统和服务…

    Java 2023年5月15日
    00
  • JsonFormat与@DateTimeFormat注解实例解析

    JsonFormat与@DateTimeFormat注解实例解析 在Java中,我们经常需要将日期和时间格式化为特定的格式。为了实现这个目的,我们可以使用@JsonFormat和@DateTimeFormat注解。在本文中,我们将详细讲解这两个注解的用法,并提供两个示例来说明这个过程。 JsonFormat注解 @JsonFormat注解用于指定日期和时间的…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部