当前位置:首页 > JavaScript

JS实现dfs

2026-03-14 08:40:47JavaScript

深度优先搜索(DFS)实现

深度优先搜索是一种用于遍历或搜索树或图的算法。在JavaScript中,可以通过递归或栈来实现DFS。

递归实现

递归实现DFS是最直观的方法,适用于树或图的遍历。

function dfs(node, visited = new Set()) {
  if (!node || visited.has(node)) return;

  visited.add(node);
  console.log(node.value); // 处理当前节点

  node.children.forEach(child => {
    dfs(child, visited);
  });
}

栈实现

使用栈可以避免递归带来的堆栈溢出问题,适合处理大规模数据。

function dfs(startNode) {
  const stack = [startNode];
  const visited = new Set();

  while (stack.length > 0) {
    const node = stack.pop();

    if (!visited.has(node)) {
      visited.add(node);
      console.log(node.value); // 处理当前节点

      // 逆序压栈,保证顺序正确
      node.children.slice().reverse().forEach(child => {
        stack.push(child);
      });
    }
  }
}

处理图结构

对于图结构,需要额外处理循环引用问题。

function dfsGraph(startNode) {
  const stack = [startNode];
  const visited = new Set();

  while (stack.length > 0) {
    const node = stack.pop();

    if (!visited.has(node)) {
      visited.add(node);
      console.log(node.value);

      node.neighbors.forEach(neighbor => {
        if (!visited.has(neighbor)) {
          stack.push(neighbor);
        }
      });
    }
  }
}

应用示例

假设有一个树结构:

JS实现dfs

const tree = {
  value: 1,
  children: [
    {
      value: 2,
      children: [
        { value: 4, children: [] },
        { value: 5, children: [] }
      ]
    },
    {
      value: 3,
      children: [
        { value: 6, children: [] },
        { value: 7, children: [] }
      ]
    }
  ]
};

dfs(tree); // 输出:1, 2, 4, 5, 3, 6, 7

注意事项

递归实现简洁但可能遇到堆栈溢出问题,栈实现更稳定但代码稍复杂。根据实际场景选择合适的实现方式。对于大型数据结构,优先考虑栈实现。

标签: JSdfs
分享给朋友:

相关文章

JS实现日期滚动选择

JS实现日期滚动选择

实现日期滚动选择的基本思路 使用HTML、CSS和JavaScript创建一个日期滚动选择器,允许用户通过滚动选择年、月、日。核心是通过监听滚动事件,动态更新显示的值。 HTML结构 创建一个包含年…

用JS实现冰墩墩

用JS实现冰墩墩

以下是用JavaScript绘制冰墩墩的几种实现方法,结合Canvas绘图和SVG路径数据: 使用Canvas绘制基础轮廓 const canvas = document.createEleme…

JS节流和防抖的实现

JS节流和防抖的实现

节流(Throttle)的实现 节流是指在一定时间间隔内,函数最多执行一次。常用于限制高频事件的触发频率,如滚动事件、窗口调整等。 function throttle(func, delay) {…

JS实现netty

JS实现netty

在JavaScript中实现类似Netty的功能 Netty是一个高性能的Java网络框架,专注于异步事件驱动的网络编程。要在JavaScript中实现类似功能,可以使用Node.js的核心模块或第三…

JS实现ln

JS实现ln

在JavaScript中实现自然对数(ln)功能可以通过以下几种方式完成: 使用Math对象的原生方法 JavaScript内置的Math对象提供了Math.log()方法,该方法默认计算以自然对数…

JS实现勋章

JS实现勋章

实现动态勋章效果 使用CSS和JavaScript创建动态旋转勋章。HTML部分定义勋章容器,CSS设置样式和动画,JavaScript控制交互行为。 <div class="badg…