深度优先与广度优先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日

相关文章

  • spring boot基于Java的容器配置讲解

    下面给出关于“spring boot基于Java的容器配置讲解”的完整攻略。 什么是Spring Boot? Spring Boot是一种基于Spring框架的快速应用开发框架。使用Spring Boot可以快速构建可部署的、生产级别的Spring应用程序,而不需要编写大量的代码,因为它提供了几乎所有的配置。 Spring Boot容器配置 在Spring …

    Java 2023年5月19日
    00
  • Java实现常见的排序算法的示例代码

    下面是“Java实现常见的排序算法的示例代码”的完整攻略。 一、了解排序算法 首先,我们需要对排序算法有所了解。排序算法就是将一组无序的数据按照一定规则进行排序的过程,目的是让数据按照一定规则有序排列,方便处理。常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、堆排序和归并排序等。每种排序算法的实现方式和时间复杂度各不相同,具体可以查看相关资料进行深入…

    Java 2023年5月19日
    00
  • SpringBoot自动配置特点与原理详细分析

    一、SpringBoot自动配置特点与原理分析 自动配置原理 SpringBoot的自动配置背后的原理是,通过条件注解来根据已有的bean、属性和类路径等来做出判断,自动调整项目的配置。 自动配置特点 约定优于配置:SpringBoot的自动配置遵循约定优于配置的原则,框架尽量避免使用XML等外置文件进行配置,采用内置默认配置的方式进行配置。 基于条件注解:…

    Java 2023年5月15日
    00
  • 深入浅析Java 抽象类和接口

    深入浅析Java 抽象类和接口 前言 Java中,抽象类和接口是两个非常重要的概念。在开发中,使用它们可以实现面向对象编程的多态性、继承性和封装性等特性。本文将从以下几个方面深入浅析Java抽象类和接口,包括定义、应用场景、区别、示例等。 定义 抽象类 抽象类是在类前面加上关键字abstract,表示这个类不能被实例化,只能被继承。抽象类可以包含非抽象方法和…

    Java 2023年5月26日
    00
  • Spring MVC 基于URL的映射规则(注解版)

    简介 在Spring MVC中,我们可以使用注解来定义URL映射规则。这种方式比传统的XML配置更加简洁和灵活。本文将详细介绍Spring MVC基于URL的映射规则(注解版),并提供两个示例说明。 基于URL的映射规则 在Spring MVC中,我们可以使用@RequestMapping注解来定义URL映射规则。以下是一个使用@RequestMapping…

    Java 2023年5月17日
    00
  • springboot集成mybatis官方生成器

    下面我会详细讲解“Spring Boot 集成 MyBatis 官方生成器”的完整攻略。 简介 在使用 MyBatis 进行开发时,为了提高开发效率、减少重复的代码编写,可以使用 MyBatis 官方生成器。而 Spring Boot 是一种优秀的 Java Web 开发框架,本文将会介绍如何在 Spring Boot 框架中集成 MyBatis 官方生成器…

    Java 2023年5月20日
    00
  • Java 模拟银行自助终端系统

    Java 模拟银行自助终端系统 系统概述 本系统是一个基于 Java 语言开发的银行自助终端系统,具有账户管理、存取款、转账等基本银行操作功能。用户可以通过自助终端完成这些操作,无需前往银行柜台。 功能模块 1. 账户管理模块 银行系统管理员可以通过该模块添加账户、删除账户、查询账户信息等。每个账户拥有唯一的账号和用户名。 2. 存取款模块 用户可以通过该模…

    Java 2023年5月24日
    00
  • JAVA 十六进制与字符串的转换

    Java 中可以通过多种方式实现十六进制和字符串之间的转化。本文将介绍两种主要的方法:使用内置类库和字节数组转换。 使用内置类库实现 Java 内置的 Integer、Long 和 Short 等类库提供了十六进制和字符串之间的转化方法。下面是一个示例: // 十六进制转字符串 int hexVal = 0x1F; String hexStr = Integ…

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