Java实现深度优先搜索(DFS)和广度优先搜索(BFS)算法

Java实现深度优先搜索(DFS)和广度优先搜索(BFS)算法

深度优先搜索(DFS)和广度优先搜索(BFS)算法是常用的遍历和搜索算法,具有很高的实用价值。在Java中,我们可以通过使用递归函数和队列这两种数据结构来实现这两种算法。下面将对这两种算法进行详细的讲解。

深度优先搜索(DFS)

深度优先搜索(DFS)是一种常用的遍历算法,其思想就是从起点开始,先遍历尽可能深的节点,直到不能再遍历为止,然后回溯到上一个未遍历的节点。在实现中,我们可以使用递归函数来实现DFS算法。

public class DFS {

    public static void dfs(int[][] graph, int start, boolean[] visited) {

        visited[start] = true;  //将当前节点标记为已访问

        System.out.print(start + " "); //输出当前节点

        for (int i = 0; i < graph.length; i++) {
            if (graph[start][i] == 1 && !visited[i]) {  //如果当前节点与下一个节点有相邻关系并且下一个节点未被访问过
                dfs(graph, i, visited); //递归访问下一个节点
            }
        }
    }

    public static void main(String[] args) {
        int[][] graph = {
                {0, 1, 1, 0, 0, 0},
                {1, 0, 0, 1, 1, 0},
                {1, 0, 0, 0, 0, 1},
                {0, 1, 0, 0, 1, 0},
                {0, 1, 0, 1, 0, 0},
                {0, 0, 1, 0, 0, 0}
        };

        boolean[] visited = new boolean[graph.length];
        Arrays.fill(visited, false);

        dfs(graph, 0, visited);
    }
}

以上代码中,我使用邻接矩阵来表示图,其中的dfs方法用于递归遍历节点,visited数组用于记录节点是否已经被访问过。

示例1:通过上述代码遍历如下图所示的图

    0 -- 1 -- 3
    |    |    |
    2    4    5

输出结果:0 1 3 4 5 2

广度优先搜索(BFS)

广度优先搜索(BFS)是一种常用的遍历算法,其思想是从起点开始,先遍历所有的相邻节点,然后再遍历相邻节点的相邻节点,直到遍历完所有的节点。在实现中,我们可以使用队列这种数据结构来实现BFS算法。

import java.util.*;

public class BFS {

    public static void bfs(int[][] graph, int start, boolean[] visited) {
        Queue<Integer> queue = new LinkedList<>();

        visited[start] = true; //将当前节点标记为已访问
        queue.offer(start); //将当前节点加入队列

        while (!queue.isEmpty()) { //只要队列中还有节点
            int node = queue.poll(); //弹出队列中的节点
            System.out.print(node + " "); //输出当前节点

            for (int i = 0; i < graph.length; i++) {
                if (graph[node][i] == 1 && !visited[i]) { //如果当前节点与下一个节点有相邻关系并且下一个节点未被访问过
                    visited[i] = true; //将下一个节点标记为已访问
                    queue.offer(i); //将下一个节点加入队列
                }
            }
        }
    }

    public static void main(String[] args) {
        int[][] graph = {
                {0, 1, 1, 0, 0, 0},
                {1, 0, 0, 1, 1, 0},
                {1, 0, 0, 0, 0, 1},
                {0, 1, 0, 0, 1, 0},
                {0, 1, 0, 1, 0, 0},
                {0, 0, 1, 0, 0, 0}
        };

        boolean[] visited = new boolean[graph.length];
        Arrays.fill(visited, false);

        bfs(graph, 0, visited);
    }
}

以上代码中,我使用邻接矩阵来表示图,其中的bfs方法用于遍历节点,visited数组用于记录节点是否已经被访问过。

示例2:通过上述代码遍历如下图所示的图

    0 -- 1 -- 3
    |    |    |
    2    4    5

输出结果:0 1 2 3 4 5

通过上述两个示例,我们可以看到DFS和BFS算法具有不同的遍历方式,在不同的问题中,我们可以根据具体情况选择正确的遍历算法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现深度优先搜索(DFS)和广度优先搜索(BFS)算法 - Python技术站

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

相关文章

  • HTML实现title 属性换行小技巧

    当我们在HTML标记中使用title属性时,有时候需要在倒数第二个单词之后添加一个换行符。这个时候我们可以用一些小技巧来完成。 方法一:使用实体字符 HTML中有几个实体字符可以用于在title属性中添加换行: &#13; 或 &#x0D; 表示回车 &#10; 或 &#x0A; 表示换行 代码示例: <a href=&…

    Java 2023年6月15日
    00
  • 详解Spring mvc的web.xml配置说明

    在Spring MVC中,web.xml文件是配置Spring MVC的重要文件之一。本文将详细讲解web.xml文件的配置说明,并提供两个示例说明。 web.xml配置说明 1. DispatcherServlet 在web.xml文件中,我们需要配置DispatcherServlet来处理Web请求和响应。下面是一个示例: <servlet>…

    Java 2023年5月18日
    00
  • Ajax修改购物车示例

    下面是详细的“Ajax修改购物车示例”的攻略: 第一步:创建购物车页面 首先,需要创建一个基础的购物车页面,包含商品列表和购物车数量和总价等信息。可以使用 HTML 和 CSS 来创建一个简单的购物车页面。 第二步:添加商品和购物车的数据 在购物车页面上添加一些商品和购物车的数据,可以使用 JavaScript 来处理这些数据。例如,可以在 JavaScri…

    Java 2023年6月15日
    00
  • HashMap和HashTable底层原理以及常见面试题

    HashMap和HashTable底层原理以及常见面试题 1. HashMap和HashTable的区别 HashMap和HashTable都是Java中的重要容器类,它们的目的是为了存放和访问键值对。虽然它们的功能是相似的,但是它们在底层的实现和使用上有很大的不同。 1.1 HashMap HashMap的底层是基于哈希表实现的,其键值对存储在Entry数…

    Java 2023年5月26日
    00
  • Json实现传值到后台代码实例

    下面我将为你详细讲解“Json实现传值到后台代码实例”的完整攻略。 什么是Json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON采用键值对的方式来表达数据,常用于前后端之间数据的传输。 Json实现传值到后台的方法 Json实现传值到后台的方法通常是通过Aj…

    Java 2023年5月26日
    00
  • jsp搜索引擎

    JSP(Java Server Pages)搜索引擎需要基于Java编程语言进行开发,可以使用已有的开源框架、工具库进行快速开发。 以下是JSP搜索引擎的完整攻略: 步骤一:创建Web应用程序 使用任意一种Java Web框架创建一个全新的Web应用程序。(注意:在接下来的步骤中,以SpringMVC框架为例进行讲解) 步骤二:集成Lucene搜索引擎 Lu…

    Java 2023年6月15日
    00
  • Java中使用fileupload组件实现文件上传功能的实例代码

    介绍 在Java Web开发中,文件上传功能是一个非常常见和基础的功能。而使用fileupload组件实现文件上传,不仅方便易用,而且功能强大,能够满足大多数文件上传需求。 本文将介绍如何使用fileupload组件实现文件上传功能的实例代码并附有完整代码和两个示例供您参考。在实现文件上传的过程中,我们需要引入Apache Commons FileUploa…

    Java 2023年5月19日
    00
  • MySQL筑基篇之增删改查操作详解

    MySQL筑基篇之增删改查操作详解 一、准备工作 在开始进行MySQL的增删改查操作前,需要先做一些准备工作。首先需要安装MySQL数据库,可以通过官方网站下载,并安装在本地机器上。安装完成后,需要登录MySQL,创建数据库并创建数据表。 1.1 登录MySQL 在命令行或终端中输入以下代码,登录MySQL: mysql -u root -p 其中,root…

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