java 实现DFS和BFS
2017-03-09 16:39
351 查看
摘抄自:http://blog.csdn.net/lemon_tree12138/article/details/47319659
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);//向队列添加一个元素成功则返回true,如果队列已满则返回false
while (!q.isEmpty()) {
GraphNode currNode = q.poll();//移除并返回队列头部的元素,如果队列为空则返回null
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
- 图的广度优先搜索(BFS)、深度优先搜索(DFS)(邻接矩阵法和邻接表法java实现)
- Java实现数据结构之深度优先搜索DFS和广度优先搜索BFS
- BFS和DFS详解以及java实现
- java实现邻接表图、DFS、BFS
- BFS和DFS详解以及java实现
- BFS和DFS详解以及java实现
- java版 图的邻接表、邻接矩阵、BFS、DFS 实现
- 【leetcode】104. Maximum Depth of Binary Tree【java】三种实现方法:递归、BFS、DFS
- BFS & DFS(Java实现)
- DFS深度优先搜索算法与BFS广度优先搜索算法的java实现
- BFS和DFS的java实现
- Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)
- BFS和DFS的java实现
- 图论算法——基于的java实现(dijkstra,bfs,dfs,floyd)
- 经典图算法Java代码实践:BFS,DFS以及几种最短路径算法
- dfs与bfs实现
- 自己动手实现图的BFS和DFS(附完整源码)
- 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
- 复习一下dfs和bfs 用java