1. 程式人生 > >圖相關演算法(二):無向無權圖的廣度優先遍歷(BFS)-非遞迴版本

圖相關演算法(二):無向無權圖的廣度優先遍歷(BFS)-非遞迴版本

核心

  • 採用鄰接表作為圖資料的儲存結構
  • 對訪問過的節點進行記錄,文中採用HashSet實現
  • 採用佇列存放未訪問的子節點,不斷更新佇列
  • BFS採用佇列實現很簡單,採用遞迴反而更復雜了

本文建立的圖結構如下:
在這裡插入圖片描述

實現程式碼如下:

package algorithms;

import java.util.*;

/**
 * Created by Json Wan on 2018/10/19.
 * 無向無權圖的廣度優先遍歷
 * 儲存結構:鄰接表
 */
public class GraphBFS {

    static class Node {
        int name;
        List<
Node>
neighbors = new ArrayList<>(); public Node(int name) { this.name = name; } public void addNeighbor(Node node) { neighbors.add(node); } @Override public String toString() { return "node"+name; }
} public static List<Node> bfs(Node rootNode) { List<Node> result = new ArrayList<>(); Set<Node> visitedNodes=new HashSet<>(); Queue<Node> queue=new LinkedList<>(); queue.add(rootNode); while(!queue.isEmpty()
){ Node node=queue.poll(); if(!visitedNodes.contains(node)){ result.add(node); visitedNodes.add(node); node.neighbors.stream().forEach(queue::add); } } return result; } 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); //建立連線//node1 node1.addNeighbor(node2); node1.addNeighbor(node3); node1.addNeighbor(node4); node1.addNeighbor(node5); //node2 node2.addNeighbor(node1); node2.addNeighbor(node4); node2.addNeighbor(node5); //node3 node3.addNeighbor(node1); node3.addNeighbor(node4); node3.addNeighbor(node5); //node4 node4.addNeighbor(node1); node4.addNeighbor(node2); node4.addNeighbor(node3); node4.addNeighbor(node6); //node5 node5.addNeighbor(node1); node5.addNeighbor(node2); node5.addNeighbor(node3); node5.addNeighbor(node6); //node6 node6.addNeighbor(node4); node6.addNeighbor(node5); //BFS演算法 List<Node> bfsPath = bfs(node1); for (Node node : bfsPath) System.out.print(node.name + " "); } }

執行結果:
1 2 3 4 5 6