- 图的遍历
从图中某一顶点出发访问图中其余顶点,且每一个顶点仅被访问一次 - 图有2种常见的遍历方式(有向图、无向图都适用)
- 广度优先搜索(Breadth First Search,BFS),又称为宽度优先搜索、横向优先搜索
- 深度优先搜索(Depth First Search,DFS)
- 发明"深度优先搜索"算法的2位科学家在1986年共同获得计算机领域的最高奖:图灵奖
广度优先搜索(Breadth First Search)
- 之前所学的二叉树层序遍历就是一种广度优先搜索
广度优先搜索 - 思路
广度优先搜索 - 实现
private void bfs(Vertex<V, E> beginVertex) {
Set<Vertex<V, E>> visitedVertices = new HashSet<>();
Queue<Vertex<V, E>> queue = new LinkedList<>();
queue.offer(beginVertex);
visitedVertices.add(beginVertex);
while (!queue.isEmpty()) {
Vertex<V, E> vertex = queue.poll();
System.out.printIn(vertex.value);
for (Edge<V, E> edge : vertex.outEdges) {
if (visiedVertices.contains(edge.to)) continue;
queue.offer(edge.to);
visitedVertices.add(edge.to);
}
}
}
深度优先搜索(Depth First Search)
- 之前所学的二叉树前序遍历就是一种深度优先搜索
深度优先搜索 - 递归实现
private void dfs(Vertex<V, E> vertex, Set<Vertex<V, E>> visitedVertices) {
System.out.printIn(vertex.value);
visitedVertices.add(vertex);
for (Edge<V, E> edge : Vertex.outEdges) {
if (visitedVertices.contains(edge.to)) continue;
dfs(edge.to, visitedVertices);
}
}
深度优先搜索 - 非递归思路
深度优先搜索 - 非递归实现
private void dfs(Vertex<V, E> beginVertex) {
Set<Vertex<V, E>> visitedVertices = new HashSet<>();
Stack<Vertex<V, E>> stack = new Stack<>();
stack.push(beginVertex);
System.out.printIn(beginVertex.value);
while (!statck.isEmpty) {
Vertex<V, E> vertex = stack.pop();
for (Edge<V, E> edge : vertex.outEdges) {
if (visitedVertices.contains(edge.to)) continue;
stack.push(edge.from);
stack.push(edge.to);
visitedVertices.add(edge.to);
System.out.printIn(edge.to.value);
break;
}
}
}