当前位置:首页 > JavaScript

dfs js实现

2026-02-01 12:45:06JavaScript

dfs js实现

dfs js实现

DFS(深度优先搜索)的 JavaScript 实现

深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。以下是几种常见的实现方式:

递归实现(适用于树或图)

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

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

  // 对于树结构
  if (node.children) {
    for (const child of node.children) {
      dfs(child, visited);
    }
  }

  // 对于图结构
  if (node.neighbors) {
    for (const neighbor of node.neighbors) {
      dfs(neighbor, visited);
    }
  }
}

迭代实现(使用栈)

function dfsIterative(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); // 处理当前节点

      // 注意顺序:为了保证与递归相同的遍历顺序,可能需要反转子节点
      const children = node.children ? [...node.children].reverse() : [];
      for (const child of children) {
        stack.push(child);
      }
    }
  }
}

图的DFS实现(处理循环)

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

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

    for (const neighbor of node.neighbors) {
      if (!visited.has(neighbor)) {
        visited.add(neighbor);
        stack.push(neighbor);
      }
    }
  }
}

使用示例

// 树节点定义
class TreeNode {
  constructor(value) {
    this.value = value;
    this.children = [];
  }
}

// 创建示例树
const root = new TreeNode(1);
const child1 = new TreeNode(2);
const child2 = new TreeNode(3);
root.children.push(child1, child2);

// 执行DFS
dfs(root);

关键点说明

  • 递归实现更简洁但可能有堆栈溢出风险
  • 迭代实现使用显式栈避免递归深度问题
  • 对于图结构必须跟踪已访问节点防止无限循环
  • 时间复杂度:O(V + E),其中V是顶点数,E是边数
  • 空间复杂度:O(V),最坏情况下需要存储所有节点

可以根据具体需求选择递归或迭代实现,并根据数据结构调整邻居/子节点的访问方式。

标签: dfsjs
分享给朋友:

相关文章

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…