图相关算法(一):无向无权图的深度优先遍历(DFS)-递归版本

核心

  • 采用邻接表作为图数据的存储结构
  • 对访问过的节点进行记录,文中采用HashSet实现
  • 根据深度优先规则递归遍历未访问节点

本文建立的图结构如下:
《图相关算法(一):无向无权图的深度优先遍历(DFS)-递归版本》

实现代码如下:

package algorithms;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/** * Created by Json Wan on 2018/10/19. * 无向无权图的深度优先遍历 * 存储结构:邻接表 */
public class GraphDFS {

    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);
        }
    }

    public static List<Node> dfs(Node rootNode) {
        return dfs(rootNode, new HashSet<Node>());
    }

    public static List<Node> dfs(Node rootNode, Set<Node> visitedNodes) {
        List<Node> result = new ArrayList<>();
        result.add(rootNode);
        visitedNodes.add(rootNode);
        rootNode.neighbors.stream().filter(node -> !visitedNodes.contains(node)).forEach(node -> {
            result.addAll(dfs(node, visitedNodes));
        });
        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);
        //DFS算法
        List<Node> dfsPath = dfs(node1);
        for (Node node : dfsPath)
            System.out.print(node.name + " ");
    }
}

运行结果:
1 2 4 3 5 6

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/wanxu12345678910/article/details/83186209
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞