📜  bfs java(1)

📅  最后修改于: 2023-12-03 14:59:31.031000             🧑  作者: Mango

BFS算法介绍

BFS(广度优先搜索)是一种在树或图数据结构中遍历或搜索的算法,它从一个根节点开始并逐层遍历整个树或图。 BFS通过队列实现,每次从队首取出一个节点,并将该节点未访问的相邻节点加入队列,直到队列为空。

BFS算法通常用于寻找最短路径或最短连通性问题,比如迷宫问题和网络连通性问题等。

Java实现

在Java中,可以使用队列来实现BFS算法。我们首先定义一个节点类(Node),用于表示树或图中的一个节点。节点包含一个值和一个相邻节点列表。

class Node {
    public int val;
    public List<Node> neighbors;
  
    public Node(int val) {
        this.val = val;
        neighbors = new ArrayList<Node>();
    }
}

然后,我们定义一个BFS函数,用于遍历整个树或图。BFS函数使用一个队列(Queue)来存储节点,用一个HashSet来记录已经访问过的节点,以避免重复访问。

public void bfs(Node root) {
    Queue<Node> queue = new LinkedList<Node>();
    Set<Node> visited = new HashSet<Node>();
  
    visited.add(root);
    queue.offer(root);
  
    while (!queue.isEmpty()) {
        Node node = queue.poll();
        System.out.println(node.val);
  
        for (Node neighbor : node.neighbors) {
            if (!visited.contains(neighbor)) {
                visited.add(neighbor);
                queue.offer(neighbor);
            }
        }
    }
}

BFS函数从根节点开始遍历并访问所有节点。首先,我们将根节点添加到队列和visited集合中,然后对队列进行循环直到队列为空。在每次循环中,我们从队列中取出一个节点并访问该节点。然后,我们将该节点的所有未访问的相邻节点添加到队列和visited集合中,以便以后访问。

示例

例如,我们可以使用以下示例图在Java中实现BFS算法。

BFS Algorithm

在这个示例中,我们从节点1开始遍历整个图。我们首先访问节点1,然后将它的相邻节点2和3添加到队列中。然后,在下一次循环中,我们从队列中取出节点2,并访问该节点。我们将节点4和5添加到队列中,然后,在下一次循环中,我们从队列中取出节点3,并访问该节点。我们将节点6添加到队列中。在下一次循环中,我们从队列中取出节点4,并访问该节点。我们将节点7和8添加到队列中。在下一次循环中,我们从队列中取出节点5,并访问该节点。我们将节点9添加到队列中。在下一次循环中,我们从队列中取出节点6,并访问该节点。我们此时确定已经遍历了整个图。

以下是BFS算法的Java实现代码:

public class BFSGraph {
  
    // BFS algorithm to traverse a graph
    public void bfs(Node root) {
        Queue<Node> queue = new LinkedList<Node>();
        Set<Node> visited = new HashSet<Node>();
      
        visited.add(root);
        queue.offer(root);
      
        while (!queue.isEmpty()) {
            Node node = queue.poll();
            System.out.println(node.val);
      
            for (Node neighbor : node.neighbors) {
                if (!visited.contains(neighbor)) {
                    visited.add(neighbor);
                    queue.offer(neighbor);
                }
            }
        }
    }
  
    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);
        Node node5 = new Node(5);
        Node node6 = new Node(6);
        Node node7 = new Node(7);
        Node node8 = new Node(8);
        Node node9 = new Node(9);
      
        node1.neighbors.add(node2);
        node1.neighbors.add(node3);
        node2.neighbors.add(node4);
        node2.neighbors.add(node5);
        node3.neighbors.add(node6);
        node4.neighbors.add(node7);
        node4.neighbors.add(node8);
        node5.neighbors.add(node9);
      
        BFSGraph bfsGraph = new BFSGraph();
        bfsGraph.bfs(node1);
    }
}

输出:

1
2
3
4
5
6
7
8
9
总结

BFS算法是一种常用的树或图搜索算法,它可以用于寻找最短路径或最短连通性问题等。在Java中,我们可以使用队列和哈希集合来实现BFS算法。BFS算法从根节点开始遍历整个树或图,并逐层遍历树或图中的所有节点。