java深度搜索与广度优先搜索
图结构展示:
实现过程:
首先,我们来看看图结构在代码中的实现。有三块逻辑:
1.图中的节点:
- public class GraphNode {
- public List<GraphEdge> edgeList = null;
- private String label = "";
- public GraphNode(String label) {
- this.label = label;
- if (edgeList == null) {
- edgeList = new ArrayList<GraphEdge>();
- }
- }
- /**
- * 给当前节点添加一条边
- * GraphNode
- * @param edge
- * 添加的边
- */
- public void addEdgeList(GraphEdge edge) {
- edgeList.add(edge);
- }
- public String getLabel() {
- return label;
- }
- }
2.图中的边:
- public class GraphEdge {
- private GraphNode nodeLeft;
- private GraphNode nodeRight;
- /**
- * @param nodeLeft
- * 边的左端
- * @param nodeRight
- * 边的右端
- */
- public GraphEdge(GraphNode nodeLeft, GraphNode nodeRight) {
- this.nodeLeft = nodeLeft;
- this.nodeRight = nodeRight;
- }
- public GraphNode getNodeLeft() {
- return nodeLeft;
- }
- public GraphNode getNodeRight() {
- return nodeRight;
- }
- }
3.把节点和边组合成一个图结构:
- public class MyGraph {
- private List<GraphNode> nodes = null;
- public void initGraph(int n) {
- if (nodes == null) {
- nodes = new ArrayList<GraphNode>();
- }
- GraphNode node = null;
- for (int i = 0; i < n; i++) {
- node = new GraphNode(String.valueOf(i));
- nodes.add(node);
- }
- }
- public void initGraph(int n, boolean b) {
- initGraph(n);
- GraphEdge edge01 = new GraphEdge(nodes.get(0), nodes.get(1));
- GraphEdge edge02 = new GraphEdge(nodes.get(0), nodes.get(2));
- GraphEdge edge13 = new GraphEdge(nodes.get(1), nodes.get(3));
- GraphEdge edge14 = new GraphEdge(nodes.get(1), nodes.get(4));
- GraphEdge edge25 = new GraphEdge(nodes.get(2), nodes.get(5));
- GraphEdge edge26 = new GraphEdge(nodes.get(2), nodes.get(6));
- GraphEdge edge37 = new GraphEdge(nodes.get(3), nodes.get(7));
- GraphEdge edge47 = new GraphEdge(nodes.get(4), nodes.get(7));
- GraphEdge edge56 = new GraphEdge(nodes.get(5), nodes.get(6));
- nodes.get(0).addEdgeList(edge01);
- nodes.get(0).addEdgeList(edge02);
- nodes.get(1).addEdgeList(edge13);
- nodes.get(1).addEdgeList(edge14);
- nodes.get(2).addEdgeList(edge25);
- nodes.get(2).addEdgeList(edge26);
- nodes.get(3).addEdgeList(edge37);
- nodes.get(4).addEdgeList(edge47);
- nodes.get(5).addEdgeList(edge56);
- }
- public void initGraph() {
- initGraph(8, false);
- }
- public List<GraphNode> getGraphNodes() {
- return nodes;
- }
- }
有了图的结构,我们就可以进行一些实际的操作了。
深度优先搜索:
- public class DFSearch {
- /**
- * 深度遍历
- * DFSearch
- * @param node
- * 当前节点
- * @param visited
- * 被访问过的节点列表
- */
- public void searchTraversing(GraphNode node, List<GraphNode> visited) {
- // 判断是否遍历过
- if (visited.contains(node)) {
- return;
- }
- visited.add(node);
- System.out.println("节点:" + node.getLabel());
- for (int i = 0; i < node.edgeList.size(); i++) {
- searchTraversing(node.edgeList.get(i).getNodeRight(), visited);
- }
- }
- }
广度优先搜索:
- public class BFSearch {
- /**
- * 广度优先搜索
- * BFSearch
- * @param node
- * 搜索的入口节点
- */
- public void searchTraversing(GraphNode node) {
- List<GraphNode> visited = new ArrayList<GraphNode>(); // 已经被访问过的元素
- Queue<GraphNode> q = new LinkedList<GraphNode>(); // 用队列存放依次要遍历的元素
- q.offer(node);
- while (!q.isEmpty()) {
- GraphNode currNode = q.poll();
- if (!visited.contains(currNode)) {
- visited.add(currNode);
- System.out.println("节点:" + currNode.getLabel());
- for (int i = 0; i < currNode.edgeList.size(); i++) {
- q.offer(currNode.edgeList.get(i).getNodeRight());
- }
- }
- }
- }
- }

运行结果:
java深度搜索与广度优先搜索的更多相关文章
- DFS_BFS(深度优先搜索 和 广度优先搜索)
package com.rao.graph; import java.util.LinkedList; /** * @author Srao * @className BFS_DFS * @date ...
- 【js数据结构】图的深度优先搜索与广度优先搜索
图类的构建 function Graph(v) {this.vertices = v;this.edges = 0;this.adj = []; for (var i = 0; i < this ...
- Depth-first search and Breadth-first search 深度优先搜索和广度优先搜索
Depth-first search Depth-first search (DFS) is an algorithm for traversing or searching tree or grap ...
- 【Python排序搜索基本算法】之深度优先搜索、广度优先搜索、拓扑排序、强联通&Kosaraju算法
Graph Search and Connectivity Generic Graph Search Goals 1. find everything findable 2. don't explor ...
- DFS或BFS(深度优先搜索或广度优先搜索遍历无向图)-04-无向图-岛屿数量
给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入: ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
随机推荐
- grid control 11.1.0.1 安装指南
grid control 11.1.0.1 安装指南 废话少说,进入正题 系统版本号 [root@gridcontrol ~]# lsb_release -a LSB Version: :bas ...
- Python: Soft_max 分类器
我们能够建立例如以下的loss function: Li=−log(pyi)=−log⎛⎝efyi∑jefj⎞⎠ L=1N∑iLi+12λ∑k∑lW2k,l 以下我们推导loss对W,b的偏导数,我们 ...
- jenkins+gitlab钩子+shell脚本基于git的tag实现App增量更新
转自:http://blog.csdn.net/kingboyworld/article/details/54175330 环境安装 jdk1.8 1.安装jenkins 首先到https://jen ...
- 用ASP.NET/C#连接Access和SQL Server数据库
连接Access 首先看一个例子代码片断:程序代码: ------------------------------------------------------------------------- ...
- 对C++对象内存模型造成的影响(类/对象的大小)
首先重新回顾一下关于类/对象大小的计算原则: 类大小计算遵循结构体对齐原则 第一个数据成员放在offset为0的位置 其它成员对齐至min(sizeof(member),#pragma pack(n) ...
- AutoFac文档4(转载)
目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 自动装配 从容器中可用 ...
- java递归算法实现拼装树形JSON数据
有时候页面需要使用jQuery easy ui中的combotree,需要给combotree提供一个JSON数据,使用如下方法(递归)实现(下面是dao层的实现层): /** * 根据表名和父id拼 ...
- centos Permission denied: make_sock: could not bind to address
CentOS 下启动Httpd 失败,报 (13)Permission denied: make_sock: could not bind to address [::]:8000 因为 小于1024 ...
- Java数据结构和算法(一):简介
本系列博客我们将学习数据结构和算法,为什么要学习数据结构和算法,这里我举个简单的例子. 编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱.一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数 ...
- C语言复杂声明解读简明方法
//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明,关键是搞清楚这个变量是个什么东西(函数.指针.数组), //是函数那么剩下的就是他的参数和返回值, / ...