深度优先遍历(DFS)和广度优先遍历(BFS)是两种常见的图或树的遍历算法。它们用于遍历和搜索图或树的数据结构。下面是对这两种遍历算法的详细介绍和实现方法。
深度优先遍历(DFS)
描述:
- 深度优先遍历 是一种优先深入到树或图的深层节点的遍历策略。它尽可能深入到每一个分支的末端,然后回溯到上一层继续遍历。
 
实现方式:
- 递归实现:
   
 
- 栈实现:
   
 
递归实现示例(以树为例):
function dfsRecursive(node, visited = new Set()) {
  if (!node || visited.has(node.value)) return;
  // 访问当前节点
  console.log(node.value);
  visited.add(node.value);
  // 遍历所有子节点
  for (let child of node.children) {
    dfsRecursive(child, visited);
  }
}
栈实现示例(以树为例):
function dfsStack(root) {
  const stack = [root];
  const visited = new Set();
  while (stack.length > 0) {
    const node = stack.pop();
    if (!node || visited.has(node.value)) continue;
    // 访问当前节点
    console.log(node.value);
    visited.add(node.value);
    // 将子节点加入栈
    for (let child of node.children) {
      stack.push(child);
    }
  }
}
广度优先遍历(BFS)
描述:
- 广度优先遍历 是一种优先遍历树或图的所有相邻节点的遍历策略。它从根节点开始,逐层向外扩展,访问所有同一层的节点,然后再向下一层扩展。
 
实现方式:
- 使用队列来存储待访问的节点,保证节点按照层次的顺序被访问。
 
实现示例(以树为例):
function bfs(root) {
  const queue = [root];
  const visited = new Set();
  while (queue.length > 0) {
    const node = queue.shift();
    if (!node || visited.has(node.value)) continue;
    // 访问当前节点
    console.log(node.value);
    visited.add(node.value);
    // 将子节点加入队列
    for (let child of node.children) {
      queue.push(child);
    }
  }
}