图结构展示:

实现过程:

首先,我们来看看图结构在代码中的实现。有三块逻辑:

1.图中的节点:

  1. public class GraphNode {
  2. public List<GraphEdge> edgeList = null;
  3. private String label = "";
  4. public GraphNode(String label) {
  5. this.label = label;
  6. if (edgeList == null) {
  7. edgeList = new ArrayList<GraphEdge>();
  8. }
  9. }
  10. /**
  11. * 给当前节点添加一条边
  12. * GraphNode
  13. * @param edge
  14. *          添加的边
  15. */
  16. public void addEdgeList(GraphEdge edge) {
  17. edgeList.add(edge);
  18. }
  19. public String getLabel() {
  20. return label;
  21. }
  22. }

2.图中的边:

  1. public class GraphEdge {
  2. private GraphNode nodeLeft;
  3. private GraphNode nodeRight;
  4. /**
  5. * @param nodeLeft
  6. *          边的左端
  7. * @param nodeRight
  8. *          边的右端
  9. */
  10. public GraphEdge(GraphNode nodeLeft, GraphNode nodeRight) {
  11. this.nodeLeft = nodeLeft;
  12. this.nodeRight = nodeRight;
  13. }
  14. public GraphNode getNodeLeft() {
  15. return nodeLeft;
  16. }
  17. public GraphNode getNodeRight() {
  18. return nodeRight;
  19. }
  20. }

3.把节点和边组合成一个图结构:

  1. public class MyGraph {
  2. private List<GraphNode> nodes = null;
  3. public void initGraph(int n) {
  4. if (nodes == null) {
  5. nodes = new ArrayList<GraphNode>();
  6. }
  7. GraphNode node = null;
  8. for (int i = 0; i < n; i++) {
  9. node = new GraphNode(String.valueOf(i));
  10. nodes.add(node);
  11. }
  12. }
  13. public void initGraph(int n, boolean b) {
  14. initGraph(n);
  15. GraphEdge edge01 = new GraphEdge(nodes.get(0), nodes.get(1));
  16. GraphEdge edge02 = new GraphEdge(nodes.get(0), nodes.get(2));
  17. GraphEdge edge13 = new GraphEdge(nodes.get(1), nodes.get(3));
  18. GraphEdge edge14 = new GraphEdge(nodes.get(1), nodes.get(4));
  19. GraphEdge edge25 = new GraphEdge(nodes.get(2), nodes.get(5));
  20. GraphEdge edge26 = new GraphEdge(nodes.get(2), nodes.get(6));
  21. GraphEdge edge37 = new GraphEdge(nodes.get(3), nodes.get(7));
  22. GraphEdge edge47 = new GraphEdge(nodes.get(4), nodes.get(7));
  23. GraphEdge edge56 = new GraphEdge(nodes.get(5), nodes.get(6));
  24. nodes.get(0).addEdgeList(edge01);
  25. nodes.get(0).addEdgeList(edge02);
  26. nodes.get(1).addEdgeList(edge13);
  27. nodes.get(1).addEdgeList(edge14);
  28. nodes.get(2).addEdgeList(edge25);
  29. nodes.get(2).addEdgeList(edge26);
  30. nodes.get(3).addEdgeList(edge37);
  31. nodes.get(4).addEdgeList(edge47);
  32. nodes.get(5).addEdgeList(edge56);
  33. }
  34. public void initGraph() {
  35. initGraph(8, false);
  36. }
  37. public List<GraphNode> getGraphNodes() {
  38. return nodes;
  39. }
  40. }

有了图的结构,我们就可以进行一些实际的操作了。

深度优先搜索:

  1. public class DFSearch {
  2. /**
  3. * 深度遍历
  4. * DFSearch
  5. * @param node
  6. *          当前节点
  7. * @param visited
  8. *          被访问过的节点列表
  9. */
  10. public void searchTraversing(GraphNode node, List<GraphNode> visited) {
  11. // 判断是否遍历过
  12. if (visited.contains(node)) {
  13. return;
  14. }
  15. visited.add(node);
  16. System.out.println("节点:" + node.getLabel());
  17. for (int i = 0; i < node.edgeList.size(); i++) {
  18. searchTraversing(node.edgeList.get(i).getNodeRight(), visited);
  19. }
  20. }
  21. }

广度优先搜索:

  1. public class BFSearch {
  2. /**
  3. * 广度优先搜索
  4. * BFSearch
  5. * @param node
  6. *          搜索的入口节点
  7. */
  8. public void searchTraversing(GraphNode node) {
  9. List<GraphNode> visited = new ArrayList<GraphNode>(); // 已经被访问过的元素
  10. Queue<GraphNode> q = new LinkedList<GraphNode>(); // 用队列存放依次要遍历的元素
  11. q.offer(node);
  12. while (!q.isEmpty()) {
  13. GraphNode currNode = q.poll();
  14. if (!visited.contains(currNode)) {
  15. visited.add(currNode);
  16. System.out.println("节点:" + currNode.getLabel());
  17. for (int i = 0; i < currNode.edgeList.size(); i++) {
  18. q.offer(currNode.edgeList.get(i).getNodeRight());
  19. }
  20. }
  21. }
  22. }
  23. }

运行结果:

java深度搜索与广度优先搜索的更多相关文章

  1. DFS_BFS(深度优先搜索 和 广度优先搜索)

    package com.rao.graph; import java.util.LinkedList; /** * @author Srao * @className BFS_DFS * @date ...

  2. 【js数据结构】图的深度优先搜索与广度优先搜索

    图类的构建 function Graph(v) {this.vertices = v;this.edges = 0;this.adj = []; for (var i = 0; i < this ...

  3. Depth-first search and Breadth-first search 深度优先搜索和广度优先搜索

    Depth-first search Depth-first search (DFS) is an algorithm for traversing or searching tree or grap ...

  4. 【Python排序搜索基本算法】之深度优先搜索、广度优先搜索、拓扑排序、强联通&Kosaraju算法

    Graph Search and Connectivity Generic Graph Search Goals 1. find everything findable 2. don't explor ...

  5. DFS或BFS(深度优先搜索或广度优先搜索遍历无向图)-04-无向图-岛屿数量

    给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入: ...

  6. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  7. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  8. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  9. 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)

    需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...

随机推荐

  1. B/S学习总结

    经过5个月的学习,B/S学习的项目完毕了. 尽管项目完毕了,可是感觉自己还是差非常远.会的太少了.须要在项目中不断实战吧.以下分别对每一个项目进行总结. 牛腩新闻公布系统 简单介绍: 跟着视频里面的牛 ...

  2. webpack CommonsChunkPlugin 提取公共代码

    1.项目结构 2.部分代码 module.js console.log('module.js'); index文件夹下的index.js require('../module.js'); consol ...

  3. xampp集成包如何重置mysql的密码

    转自:http://blog.sina.com.cn/s/blog_4b2bcac501013s4l.html 安装使用xampp,装好后root默认没有密码,phpmyadmin是用config文件 ...

  4. Android-PullToRefresh(一)

    先讲下这篇写啥东西,也就是这家伙(chrisbanes)写的一个上拉下拉刷新的Demo,连接https://github.com/fengcunhan/Android-PullToRefresh 东西 ...

  5. Tomcat 关闭时报错

    最近tomcat走普通的关闭方式无法正常关闭,会报一些Error,用的是Tomcat7,据说是Tomcat7在关闭的时候加了一些检查线程泄漏内存泄露的东西 总结起来,在我项目中有这么几个原因会导致关闭 ...

  6. CDH quick start VM 中运行wordcount例子

    需要注意的事情: 1. 对于wordcount1.0 ,按照http://www.cloudera.com/content/cloudera/en/documentation/HadoopTutori ...

  7. Android中TextView内容过长加省略号

          textview中有个内容过长加省略号的属性,即ellipsize,用法如下: 在xml中 Android:ellipsize = "end"   省略号在结尾 and ...

  8. 构造函数、析构函数、赋值与初始化、explicit关键字

    一.构造函数.默认构造函数 (1).构造函数 构造函数是特殊的成员函数 创建类类型的新对象,系统自动会调用构造函数 构造函数是为了保证对象的每个数据成员都被正确初始化 函数名和类名完全相同 不能定义构 ...

  9. DHCP(动态主机配置协议)工作流程

    一.DHCP的作用 我们先来看一下什么是DHCP,DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)它可以为客户机自动分配IP地址.子网掩码以及缺省网 ...

  10. js获取当前域名的方法

    一.获取当前域名 1.方法一 var domain = document.domain; 2.方法二 var domain = window.location.host; 但是获取到的domain在线 ...