Java广度优先遍历递归实现

介绍

在Java中,广度优先遍历(BFS)是一种常用的图遍历算法。它通过逐层遍历图的节点,从而实现对图的完整遍历。本文将教会你如何使用递归方法实现Java中的广度优先遍历。

步骤

下面是实现Java广度优先遍历的步骤:

步骤 说明
1 创建一个队列,用于存储待访问的节点
2 将起始节点添加到队列中
3 创建一个HashSet,用于存储已访问过的节点,将起始节点添加到HashSet中
4 当队列不为空时,执行以下步骤:<br> 4.1 从队列中取出一个节点<br> 4.2 访问该节点<br> 4.3 将该节点的所有未访问过的邻居节点添加到队列中<br> 4.4 将该节点添加到HashSet中,标记为已访问
5 重复步骤4直到队列为空

代码实现

下面是实现Java广度优先遍历的代码:

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

public class BFSExample {
    public void breadthFirstSearch(Node startNode) {
        Queue<Node> queue = new LinkedList<>(); // 创建一个队列
        HashSet<Node> visited = new HashSet<>(); // 创建一个HashSet
        
        queue.add(startNode); // 将起始节点添加到队列中
        visited.add(startNode); // 将起始节点添加到HashSet中
        
        while (!queue.isEmpty()) { // 当队列不为空时
            Node currentNode = queue.poll(); // 从队列中取出一个节点
            visit(currentNode); // 访问该节点
            
            for (Node neighbor : currentNode.getNeighbors()) { // 遍历该节点的邻居节点
                if (!visited.contains(neighbor)) { // 如果邻居节点未被访问过
                    queue.add(neighbor); // 将邻居节点添加到队列中
                    visited.add(neighbor); // 将邻居节点添加到HashSet中
                }
            }
        }
    }

    private void visit(Node node) {
        // 对节点进行访问操作,例如打印节点的值
        System.out.println(node.getValue());
    }
}

上述代码中,我们使用了一个队列来存储待访问的节点,以及一个HashSet来存储已访问过的节点。在每一次循环中,我们从队列中取出一个节点,并访问它。然后,我们将该节点的所有未访问过的邻居节点添加到队列中,并将邻居节点标记为已访问。

示例

下面是一个简单的示例,展示了如何使用上述代码实现广度优先遍历:

public class Main {
    public static void main(String[] args) {
        Node node1 = new Node("1");
        Node node2 = new Node("2");
        Node node3 = new Node("3");
        Node node4 = new Node("4");
        
        node1.addNeighbor(node2);
        node1.addNeighbor(node3);
        node2.addNeighbor(node4);
        
        BFSExample bfsExample = new BFSExample();
        bfsExample.breadthFirstSearch(node1);
    }
}

在上述示例中,我们创建了一个图,其中节点1有两个邻居节点2和3,节点2有一个邻居节点4。然后,我们使用BFSExample类的breadthFirstSearch方法对该图进行广度优先遍历。

旅行图

下面是一个使用mermaid语法表示的广度优先遍历的旅行图:

journey
  title Java广度优先遍历递归实现

  section 创建队列和HashSet
    创建一个队列 -> 创建一个HashSet

  section 添加起始节点
    将起始节点添加到队列中 -> 将起始节点添加到HashSet中

  section 遍历队列
    从队列中取出一个节点 -> 访问该节点 -> 将邻居节点添加到队列中 -> 将邻居节点添加到HashSet中

  section 重复上述步骤