深度优先与广度优先Java实现代码示例

下面我来详细讲解一下“深度优先与广度优先Java实现代码示例”的攻略。

一、深度优先搜索

1. 简介

深度优先搜索(DFS)是一种经典的搜索方法,其基本思想是从一个起始状态开始,尽可能地遍历尽每一个可能到达的状态,直到搜索完所有的状态或者找到了一个目标状态。

2. 实现代码示例

下面是一个简单的深度优先搜索的Java实现代码示例:

public void dfs(Node node) {
    if (node == null) {
        return;
    }
    System.out.println(node.value);
    node.visited = true;
    for (Node child : node.children) {
        if (!child.visited) {
            dfs(child);
        }
    }
}

该代码中,dfs()方法接收一个Node类型的参数node作为起始状态,然后对node进行遍历,输出该节点的值,并将其visited属性设为true。接着遍历node的所有未访问的子节点,对未访问的子节点递归调用dfs()方法。

二、广度优先搜索

1. 简介

广度优先搜索(BFS)也是一种常见的搜索算法,与深度优先搜索不同的是,BFS从起始状态开始,逐步向外进行搜索,先搜索到的节点一定是离起始节点最近的,后搜索到的节点一定离起始节点更远。

2. 实现代码示例

下面是一个简单的广度优先搜索的Java实现代码示例:

public void bfs(Node node) {
    if (node == null) {
        return;
    }
    Queue<Node> q = new LinkedList<Node>();
    q.offer(node);
    node.visited = true;
    while (!q.isEmpty()) {
        Node n = q.poll();
        System.out.println(n.value);
        for (Node child : n.children) {
            if (!child.visited) {
                q.offer(child);
                child.visited = true;
            }
        }
    }
}

该代码中,bfs()方法同样接收一个Node类型的参数node作为起始状态,首先将node加入一个队列q中。接着进行循环,从队列中取出一个节点n并输出其值,然后将n的所有未访问的子节点加入队列中。值得注意的是,在将子节点加入队列之前,还需要将其visited属性设为true,避免重复访问。

三、示例说明

以一个二叉树为例,来说明深度优先搜索和广度优先搜索的实现。

1. 二叉树结构

我们定义一个二叉树的Node类,其结构如下:

class Node {
    public int value;
    public Node left;
    public Node right;
    public boolean visited;
}

其中,value表示节点的值,left和right分别表示该节点的左右子节点,visited表示该节点是否已被访问过。

假设我们有如下的一棵二叉树:

     5
   /   \
  3     8
 / \   / \
2   4 7   9

2. 深度优先搜索示例

对上述二叉树进行深度优先搜索,我们可以按照先序遍历的顺序,从根节点开始遍历,输出5、3、2、4、8、7、9,代码如下:

public void dfs(Node node) {
    if (node == null) {
        return;
    }
    System.out.println(node.value);
    node.visited = true;
    if (node.left != null && !node.left.visited) {
        dfs(node.left);
    }
    if (node.right != null && !node.right.visited) {
        dfs(node.right);
    }
}

3. 广度优先搜索示例

对上述二叉树进行广度优先搜索,我们需要用一个队列来存储每一层的节点,从根节点开始,输出5、3、8、2、4、7、9,代码如下:

public void bfs(Node node) {
    if (node == null) {
        return;
    }
    Queue<Node> q = new LinkedList<Node>();
    q.offer(node);
    node.visited = true;
    while (!q.isEmpty()) {
        Node n = q.poll();
        System.out.println(n.value);
        if (n.left != null && !n.left.visited) {
            q.offer(n.left);
            n.left.visited = true;
        }
        if (n.right != null && !n.right.visited) {
            q.offer(n.right);
            n.right.visited = true;
        }
    }
}

以上是“深度优先与广度优先Java实现代码示例”的完整攻略,希望能对你有所帮助。

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

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

相关文章

  • Mybatis-plus在项目中的简单应用

    以下是Mybatis-plus在项目中的简单应用攻略: 1. 简介 Mybatis-plus是Mybatis的增强工具,它大大简化了Mybatis的使用。Mybatis-plus提供了各种方便的功能,如:自动生成代码、分页查询、乐观锁、多租户等。 2. 安装 在Maven项目中使用Mybatis-plus,需在pom.xml中添加相关依赖: <depe…

    Java 2023年5月20日
    00
  • 使用Mybatis如何实现多个控制条件查询

    使用 Mybatis 实现多个控制条件查询需要做以下几步: 定义 Mapper 接口方法并在 SQL 语句中使用 Mybatis 动态 SQL。 Mybatis 提供了 if 、where、choose、when、otherwise等标签来实现动态 SQL,通过这些标签可以方便地拼接sql语句来实现多个控制条件的查询。 例如,有一个需求是根据用户输入的查询条…

    Java 2023年5月20日
    00
  • maven springboot如何将jar包打包到指定目录

    以下是 Maven Spring Boot 如何将 Jar 包打包到指定目录的攻略,步骤如下: 第一步:在 Maven pom.xml 文件中添加插件 首先需要在 pom.xml 文件中添加 maven-jar-plugin 插件,然后设置输出目录: <build> <plugins> <plugin> <group…

    Java 2023年5月19日
    00
  • 通过Session案例分析一次性验证码登录

    下面我将为您详细讲解如何通过Session实现一次性验证码登录的完整攻略。 什么是一次性验证码登录 一次性验证码登录是指用户在输入正确的账号密码后,需要再次输入一次性验证码才能成功登录的方式,以增加登录的安全性。该方式常用于网上银行、支付等需要较高安全性的场景中。 实现方式 一次性验证码登录的实现方式比较简单,主要通过Session来完成。具体步骤如下: 用…

    Java 2023年6月15日
    00
  • Spring Cloud Feign 自定义配置(重试、拦截与错误码处理) 代码实践

    下面是关于“Spring Cloud Feign 自定义配置(重试、拦截与错误码处理)”的完整攻略详情。 1. 什么是 Spring Cloud Feign Spring Cloud Feign 是一个声明式 REST 客户端,它使通过 HTTP 通信的服务调用变得更加简单。 Feign 会通过定义接口的方式来注入需要访问的远程服务,这样就可以像调用本地方法…

    Java 2023年5月20日
    00
  • Spring Boot中使用Spring-data-jpa的配置方法详解

    “Spring Boot中使用Spring-data-jpa的配置方法详解”的攻略如下: 1. 添加Spring Data JPA依赖 在项目的pom.xml文件中添加Spring Data JPA的依赖: <dependency> <groupId>org.springframework.boot</groupId> &…

    Java 2023年5月20日
    00
  • 在本地用idea连接虚拟机上的hbase集群的实现代码

    下面是在本地用idea连接虚拟机上的hbase集群的实现代码的完整攻略。 连接HBase集群 准备工作 安装HBase 安装Zookeeper 开启HBase和Zookeeper服务 在IDEA中配置HBase插件 下载Intellij IDEA插件 HBase Integration 安装后重启IDEA 在IDEA的Settings -> Other…

    Java 2023年5月19日
    00
  • Java中的多种文件上传方式总结

    下面我将详细讲解“Java中的多种文件上传方式总结”的完整攻略。 Java中的多种文件上传方式总结 背景 在Web应用程序中,常常需要上传文件,例如上传图片、视频、文件等等。Java中有多种文件上传方式,下面将为大家总结这些方式及其优缺点。 方式一:使用Servlet 3.0提供的Part接口进行文件上传 在Servlet 3.0中,新增了Part接口,可以…

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