js写一个深度优先搜索
时间: 2023-09-13 11:05:22 浏览: 174
### 回答1:
function dfs(node) {
if (!node) return;
console.log(node.value);
dfs(node.left);
dfs(node.right);
}
// 示例
const tree = {
value: 1,
left: {
value: 2,
left: {
value: 4,
left: null,
right: null,
},
right: {
value: 5,
left: null,
right: null,
},
},
right: {
value: 3,
left: {
value: 6,
left: null,
right: null,
},
right: null,
},
};
dfs(tree);
### 回答2:
深度优先搜索(DFS)是一种常用的图算法,可以用来遍历或搜索图的节点。下面是一个用JavaScript编写的深度优先搜索算法的例子:
```javascript
class Graph {
constructor(vertices) {
this.vertices = vertices;
this.adjList = new Map();
}
addVertex(v) {
this.adjList.set(v, []);
}
addEdge(v, w) {
this.adjList.get(v).push(w);
this.adjList.get(w).push(v);
}
DFSUtil(v, visited) {
visited[v] = true;
console.log(v);
let neighbors = this.adjList.get(v);
for (let neighbor of neighbors) {
if (!visited[neighbor]) {
this.DFSUtil(neighbor, visited);
}
}
}
DFS(v) {
let visited = new Array(this.vertices).fill(false);
this.DFSUtil(v, visited);
}
}
let graph = new Graph(5);
let vertices = [0, 1, 2, 3, 4];
for (let v of vertices) {
graph.addVertex(v);
}
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(1, 3);
graph.addEdge(2, 4);
console.log("深度优先搜索结果:");
graph.DFS(0);
```
该例子中,定义了一个`Graph`类表示图,构造函数接受一个整数参数`vertices`代表图中节点的个数。`adjList`是一个`Map`类型的属性,用于存储每个节点的邻接节点。`addVertex`方法用于添加节点,`addEdge`方法用于添加边。
`DFSUtil`是一个递归函数,用于实现深度优先搜索。它接受两个参数:当前节点`v`和一个`visited`数组,用于记录节点是否已经被访问过。首先将当前节点标记为已访问并输出该节点,然后遍历当前节点的邻接节点,如果邻接节点尚未访问,则递归调用`DFSUtil`函数。
`DFS`是外部调用的深度优先搜索函数,它接受一个起始节点`v`作为参数,创建一个`visited`数组用于记录节点是否被访问过,并调用`DFSUtil`函数进行搜索。
在例子中创建了一个包含5个节点的图,并添加了边。然后调用`DFS(0)`进行深度优先搜索,并输出搜索结果。
以上就是一个用JavaScript编写的深度优先搜索算法的例子。
### 回答3:
深度优先搜索(DFS)是一种遍历或搜索树、图的算法。在使用 JavaScript 编写深度优先搜索算法时,我们可以使用递归。
深度优先搜索的基本思想是从起始节点开始,访问该节点,并尽可能深入搜索未访问过的节点。当搜索到达不能深入的节点时,则返回上一个节点,继续搜索未访问完的节点。
下面是使用 JavaScript 编写的深度优先搜索算法示例:
```javascript
// 定义图的类
class Graph {
constructor() {
this.vertices = [];
this.adjList = new Map();
}
// 添加顶点
addVertex(v) {
this.vertices.push(v);
this.adjList.set(v, []);
}
// 添加边
addEdge(v, w) {
this.adjList.get(v).push(w);
this.adjList.get(w).push(v);
}
// 深度优先搜索
dfs(startingNode) {
const visited = new Set(); // 记录已访问的节点
this.dfsHelper(startingNode, visited);
}
dfsHelper(v, visited) {
visited.add(v);
console.log(v);
const neighbors = this.adjList.get(v);
for (const neighbor of neighbors) {
if (!visited.has(neighbor)) {
this.dfsHelper(neighbor, visited);
}
}
}
}
// 使用示例
const graph = new Graph();
// 添加节点和边
const vertices = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'];
for (const v of vertices) {
graph.addVertex(v);
}
graph.addEdge('A', 'B');
graph.addEdge('A', 'C');
graph.addEdge('A', 'D');
graph.addEdge('C', 'D');
graph.addEdge('C', 'G');
graph.addEdge('D', 'G');
graph.addEdge('D', 'H');
graph.addEdge('B', 'E');
graph.addEdge('B', 'F');
graph.addEdge('E', 'I');
// 调用深度优先搜索算法
graph.dfs('A');
```
以上代码中,我们先定义了一个图的类 `Graph`,其中包含了添加顶点和边的方法。在 `dfs` 方法中,我们首先创建一个 `Set` 类型的集合 `visited`,用于记录已访问的节点。然后,我们调用 `dfsHelper` 方法开始进行深度优先搜索。在这个方法中,我们将当前节点标记为已访问,并打印出该节点。然后,我们遍历当前节点的所有邻居节点,如果邻居节点尚未访问,则继续递归调用 `dfsHelper` 方法。整个深度优先搜索的过程通过递归实现。
以上就是使用 JavaScript 编写的深度优先搜索算法的示例。希望对你有所帮助!
阅读全文