Skip to content

介绍下深度优先遍历和广度优先遍历,如何实现?

Posted on:2024年8月14日 at 23:40

深度优先遍历(DFS)和广度优先遍历(BFS)是两种常见的图或树的遍历算法。它们用于遍历和搜索图或树的数据结构。下面是对这两种遍历算法的详细介绍和实现方法。

深度优先遍历(DFS)

描述

实现方式

  1. 递归实现
    • 使用递归函数遍历每个节点。
  2. 栈实现
    • 使用栈来模拟递归过程,手动维护节点的遍历状态。

递归实现示例(以树为例):

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);
    }
  }
}
原文转自:https://fe.ecool.fun/topic/f1c73b17-109f-45e6-a4ad-8cee1bef2c8b