文章目录
一、图例
(一)、访问序列:
- DFS: v1->v2->v4->v8->v5->v3->v6->v7
- BDS: v1->v2->v3->v4->v5->v6->v7->v8
二、深度优先搜索遍历
(一)、定义
- 特点: 单向前进,回路回退。
- 二叉树: 前序遍历,中序遍历,后序遍历。
- 图的遍历: 从图中某一顶点出发,访遍图中其余的顶点,且每个顶点仅被访问一次。
- 思路: 在图的遍历过程中,记下每个已访问过的顶点。为此:
可以设置一个辅助数组:visited[0, ..., n-1]。
它的初始值为0 或 False,一旦访问了顶点,便置visited[i]为 1 或 为被访问时的次序号。
- 深度优先搜索: Depth_First Search,函数命名:DFSTraverse
- 当用邻接表: 储存图,时间复杂度:O( n+e )
(二)、数据结构
(三)、Java代码
深度度优先搜索遍历:
/**
* DFS
*
* @ 1. valueOfVex函数,在MGraph里面
* @ 2. 方法:递归
* @ 3. private 这个函数只能在当前类使用,避免混乱
* @param isVisited 是形参
* @param v
*/
private void DFSTraverse(boolean[] isVisited, int v) {
System.out.print(valueOfVex(v) + "->");
visited[v] = true;
int w = indexOfFirstNeighbor(v);
while (w != -1) {
if (!visited[w]) {
DFSTraverse(visited, w);
}
w = indexOfNextNeighbor(v, w);
}
}
/**
* DFSTraverse
*
* @ 1. DFSTraverse()方法的重载
* @ 2. DFSTraverse()方法对父类MGraph重写
* @ 3. Override 是否在父类中
*/
@Override
public void DFSTraverse() {
System.out.println();
System.out.println("深度优先搜索遍历:");
// 关键代码
visited = new boolean[vexNum];
for (int i = 0; i < vexNum; i++) {
if (!visited[i]) {
DFSTraverse(visited, i);
}
}
System.out.print("NULL");
}
三、广度优先搜索遍历
(一)、定义
- 二叉树: 层次遍历。
- 广度优先搜索: Breadth_First Search,函数命名:BFSTraverse
- 有些东西在上面就将了。
(二)、数据结构
(三)Java代码
广度优先搜索遍历:
/**
* BFS
*
* @ 1. private 这个函数只能在当前类使用,避免混乱
* @ 2. 方法:队列
* @param isVisited
* @param v
*/
private void BFSTraverse(boolean[] isVisited, int v) {
int u;
int