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

核心

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

本文建立的图结构如下:
在这里插入图片描述

实现代码如下:

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值