什么是dfs?
深度优先搜索(depth-first-search,dfs)是一种用于遍历或搜索树或图的算法。其主要思想是从起点开始遍历,选择一条未被访问的边前进,若该节点没有未被访问的边,则返回上一个节点并选择另外一条未被访问的边,并依此类推,直到所有节点都被访问。
在java中,实现dfs可以使用递归或栈来处理代码。下面我们将分别介绍这两种实现方式。
使用递归实现dfs
使用递归实现dfs比较直观和简单。主要思路是递归遍历每个节点,并在递归中处理未被访问的边。下面是一个简单的使用递归实现dfs的例子:
```
class graph {
private int v; // 节点数
private linkedlist adj[]; // 邻接表
graph(int v) {
v = v;
adj = new linkedlist[v];
for (int i = 0; i < v; i) {
adj[i] = new linkedlist();
}
}
// 添加边
void addedge(int v, int w) {
adj[v].add(w);
}
// dfs搜索
void dfs(int v, boolean visited[]) {
visited[v] = true;
system.out.print(v " ");
iterator i = adj[v].listiterator();
while (i.hasnext()) {
int n = i.next();
if (!visited[n]) {
dfs(n, visited);
}
}
}
// 使用dfs搜索节点
void dfssearch(int v) {
boolean visited[] = new boolean[v];
dfs(v, visited);
}
}
```
上面的代码中,我们定义了一个graph类,其中包含节点数v和邻接表adj[]。在dfs方法中,我们首先将当前节点v设为已访问,并输出该节点信息。然后通过邻接表获取与该节点相邻的节点列表,对于每一个节点n,如果该节点未被访问,递归调用dfs方法进行遍历。
使用栈实现dfs
使用栈实现dfs的思路与递归类似,需要一个辅助栈来存储节点信息。主要思路是从起点开始,将其压入栈中,然后在循环中取出栈顶节点v,并标记其为已访问。接着通过邻接表获取与该节点相邻的节点列表,对于每一个节点n,如果该节点未被访问,将其压入栈中。直到栈为空为止。
下面是一个使用栈实现dfs的例子:
```
class graph {
private int v; // 节点数
private linkedlist adj[]; // 邻接表
graph(int v) {
v = v;
adj = new linkedlist[v];
for (int i = 0; i < v; i) {
adj[i] = new linkedlist();
}
}
// 添加边
void addedge(int v, int w) {
adj[v].add(w);
}
// dfs搜索
void dfssearch(int s) {
boolean visited[] = new boolean[v];
stack stack = new stack();
stack.push(s);
while (!stack.isempty()) {
s = stack.pop();
if (!visited[s]) {
visited[s] = true;
system.out.print(s " ");
}
iterator i = adj[s].iterator();
while (i.hasnext()) {
int n = i.next();
if (!visited[n]) {
stack.push(n);
}
}
}
}
}
```
上面的代码中,我们定义了一个graph类,其中包含节点数v和邻接表adj[]。在dfssearch方法中,我们首先定义一个栈,并将起点s压入栈中,然后进入循环。在循环中,从栈中取出栈顶节点s,并标记其为已访问。接着通过邻接表获取与该节点相邻的节点列表,对于每一个节点n,如果该节点未被访问,将其压入栈中,直到栈为空为止。
本文来自投稿,不代表亲测学习网立场,如若转载,请注明出处:https://www.qince.net/javapeixungr-2.html
郑重声明:
本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。 若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
我们不承担任何技术及捕鱼10元起上10元下的版权问题,且不对任何资源负法律责任。
如遇到资源无法下载,请点击这里失效报错。失效报错提交后记得查看你的留言信息,24小时之内反馈信息。
如有侵犯您的捕鱼10元起上10元下的版权,请给我们私信,我们会尽快处理,并诚恳的向你道歉!