深度优先遍历(Depth-First Search,DFS)和广度优先遍历(Breadth-First Search,BFS)是两种常见的图或树的遍历算法。它们在遍历顺序和应用场景上有所不同,下面详细介绍这两种遍历方式。
// 以图的邻接表表示为例
function dfs(graph, start, visited = new Set()) {
if (visited.has(start)) return;
console.log(start); // 访问节点
visited.add(start);
for (let neighbor of graph[start]) {
dfs(graph, neighbor, visited);
}
}
// 示例图:邻接表表示
const graph = {
A: ['B', 'C'],
B: ['D', 'E'],
C: ['F'],
D: [],
E: ['F'],
F: []
};
dfs(graph, 'A');
// 输出顺序可能为:A -> B -> D -> E -> F -> C
function dfsIterative(graph, start) {
const stack = [start];
const visited = new Set();
while (stack.length > 0) {
const node = stack.pop();
if (!visited.has(node)) {
console.log(node); // 访问节点
visited.add(node);
// 将邻居节点入栈
for (let neighbor of graph[node]) {
stack.push(neighbor);
}
}
}
}
dfsIterative(graph, 'A');
// 输出顺序可能为:A -> C -> F -> B -> E -> D
function bfs(graph, start) {
const queue = [start];
const visited = new Set();
visited.add(start);
while (queue.length > 0) {
const node = queue.shift();
console.log(node); // 访问节点
for (let neighbor of graph[node]) {
if (!visited.has(neighbor)) {
visited.add(neighbor);
queue.push(neighbor);
}
}
}
}
bfs(graph, 'A');
// 输出顺序可能为:A -> B -> C -> D -> E -> F
根据具体问题的需求选择合适的遍历算法,有时还需要结合具体数据结构和性能需求来综合考虑。
深度优先遍历
let deepTraversal = (node, nodeList = []) => {
if (node !== null) {
nodeList.push(node)
let children = node.children
for (let i = 0; i < children.length; i++) {
deepTraversal(children[i], nodeList)
}
}
return nodeList;
}
广度优先遍历
let widthTraversal = (node) => {
let nodes = []
let stack = []
if (node) {
stack.push(node)
while (stack.length) {
let item = stack.shift()
let children = item.children
nodes.push(item)
// 队列,先进先出
for (let i = 0; i < children.length; i++) {
stack.push(children[i])
}
}
}
return nodes
}
