找到W
未被访问
访问过
未找到W
1. 访问并输出初始结点V,并标记该V结点已被访问
2. 查找V结点某个邻接结点W
3. 是否找到W?
是否W已经被访问过?
对W进行深度遍历 – 递归进入该结点(即V为W,重复1、2、3步骤)
查找V的下一个邻接结点 – 从步骤3开始
未找到
返回到上一层递归
深度优先遍历代码
写法1
public int getFirstNeigbor(int index) {
for(int j = 0; j <vertexs.size(); j++) {
if(edges[index][j] > 0) {
return j;
}
}
return -1;
}
public int getNextNeigbor(int index, int w) {
for(int j = w+1; j<vertexs.size(); j++ ) {
if(edges[index][j] > 0) {
return j;
}
}
return -1;
}
public void dfs(boolean[] isVisited, int i) {
System.out.println(vertexs.get(i));
isVisited[i] = true;
int w = getFirstNeigbor(i);
while(w != -1) {
if(!isVisited[w]) {
dfs(isVisited, w);
}
w = getNextNeigbor(i, w);
}
}
public void dfs() {
for(int i = 0; i<getVertexsNum(); i++) {
if(isVisable[i] == false) {
dfs(i);
}
}
for(int i = 0; i < isVisable.length; i++) {
isVisable[i] = false;
}
}
写法2
public int getNextNeigbor2(int index) {
for(int j = 0; j<isVisable.length; j++) {
if(edges[index][j] > 0 && isVisable[j] == false) {
return j;
}
}
return -1;
}
public void dfs2(int i) {
System.out.println(vertexs.get(i));
isVisable[i] = true;
int w = getNextNeigbor2(i);
while(w != -1) {
dfs2(w);
w = getNextNeigbor2(i);
}
}
public void dfs2() {
for(int i = 0; i<getVertexsNum(); i++) {
if(isVisable[i] == false) {
dfs2(i);
}
}
for(int i = 0; i < isVisable.length; i++) {
isVisable[i] = false;
}
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yXBq9WWz-1587795740743)(en-resource://database/32766:3)]](https://www.bmabk.com/wp-content/uploads/2022/05/post-loading.gif)
测试
public static void main(String[] args) {
String[] vertexs = {"v1", "v2", "v3", "v4"};
Integer n = vertexs.length;
UndirectedWeightGraph graph = new UndirectedWeightGraph(n);
for (String vertex : vertexs) {
graph.insertVertex(vertex);
}
graph.insertWeight(0, 1, 1);
graph.insertWeight(0, 2, 1);
graph.insertWeight(1, 2, 1);
graph.insertWeight(1, 3, 1);
graph.showGrpah();
graph.dfs2();
}
流程讲解
1. 首先dfs2( 0 ) 打印V1
2. 寻找与V1相邻并且未访问过的邻结点 找到V2即 1
3. 进入递归 dfs(1) 打印V2
4. 寻找与V2相邻并且未访问过的邻结点 找到V3即 2
5. 进入递归 dfs(2) 打印V3
6. 寻找与V3相邻并且未访问过的邻结点 未找到 退出dfs(2)这个递归 返回到dfs(1)这个递归
7. 寻找与V2相邻并且未访问过的邻结点 找到V4即 3
8. 进入递归 dfs(3) 打印V4
9. 寻找与V4相邻并且未访问过的邻结点 未找到 退出dfs(3)这个递归 返回到dfs(1)这个递归
10. 寻找与V2相邻并且未访问过的邻结点 未找到 退出dfs(1)这个递归 返回到dfs(0)这个递归
11. 寻找与V1相邻并且未访问过的邻结点 未找到 退出dfs(0) 结束函数
2.1.2.2 广度优先遍历(BFS)- 分层搜索
BFS思想:从队列弹出的结点为基准,访问该结点的所有未被访问的邻结节点,并将其放入队列中。如果该弹出的结点所有邻接结点被访问完,则从队列弹出一个结点,重复前者动作
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yu8AQUZA-1587795740748)(en-resource://database/32776:1)]](https://www.bmabk.com/wp-content/uploads/2022/05/post-loading.gif)
public int getNextNeigbor2(int index) {
for (int j = 0; j < isVisable.length; j++) {
if (edges[index][j] > 0 && isVisable[j] == false) {
return j;
}
}
return -1;
}
public void bfs(int i) {
LinkedList<Integer> queue = new LinkedList();
queue.addLast(i);
int u = queue.removeFirst();
System.out.println(this.getVertexByIndex(i));
isVisable[u] = true;
while(true) {
int w = getNextNeigbor2(u);
if(w != -1) {
System.out.println(getVertexByIndex(w));
isVisable[w] = true;
queue.addLast(w);
}else {
if(queue.size() == 0) {
break;
}
u = queue.removeFirst();
}
}
}
public void bfs() {
for(int i = 0; i < getVertexsNum(); i++) {
if( isVisable[i] == false) {
bfs(i);
}
}
for(int i = 0; i < isVisable.length; i++) {
isVisable[i] = false;
}
}
2.1.2.3 案例讲解
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QuwLym09-1587795740753)(en-resource://database/32780:1)]](https://www.bmabk.com/wp-content/uploads/2022/05/post-loading.gif)
#深度优先遍历DFS
1 -> 2 -> 4 -> 8 -> 5 -> 3 -> 6 -> 7
#广度优先遍历BFS
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/46515.html
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!