当前位置:首页 > JavaScript

js实现bfs

2026-02-01 00:32:00JavaScript

JavaScript 实现广度优先搜索(BFS)

广度优先搜索(BFS)是一种用于遍历或搜索树或图的算法,它从根节点开始,逐层访问所有相邻节点。以下是 JavaScript 实现 BFS 的几种常见方法。

基于队列的 BFS 实现

BFS 通常使用队列数据结构来实现,以下是针对树或图的通用实现方式。

树的 BFS 实现

假设树的节点结构如下:

class TreeNode {
  constructor(val) {
    this.val = val;
    this.children = [];
  }
}

BFS 实现代码:

function bfsTree(root) {
  if (!root) return [];
  const queue = [root];
  const result = [];
  while (queue.length > 0) {
    const node = queue.shift();
    result.push(node.val);
    for (const child of node.children) {
      queue.push(child);
    }
  }
  return result;
}

图的 BFS 实现

对于图结构,需要使用一个 visited 集合来避免重复访问。

function bfsGraph(startNode) {
  const queue = [startNode];
  const visited = new Set();
  visited.add(startNode);
  const result = [];
  while (queue.length > 0) {
    const node = queue.shift();
    result.push(node.val);
    for (const neighbor of node.neighbors) {
      if (!visited.has(neighbor)) {
        visited.add(neighbor);
        queue.push(neighbor);
      }
    }
  }
  return result;
}

处理层级信息

如果需要记录每一层的节点,可以通过以下方式实现:

function bfsWithLevels(root) {
  if (!root) return [];
  const queue = [root];
  const result = [];
  while (queue.length > 0) {
    const levelSize = queue.length;
    const currentLevel = [];
    for (let i = 0; i < levelSize; i++) {
      const node = queue.shift();
      currentLevel.push(node.val);
      for (const child of node.children) {
        queue.push(child);
      }
    }
    result.push(currentLevel);
  }
  return result;
}

应用场景示例

  1. 二叉树层级遍历
    对于二叉树,BFS 可以用于按层输出节点值:

    function levelOrder(root) {
      if (!root) return [];
      const queue = [root];
      const result = [];
      while (queue.length > 0) {
        const levelSize = queue.length;
        const level = [];
        for (let i = 0; i < levelSize; i++) {
          const node = queue.shift();
          level.push(node.val);
          if (node.left) queue.push(node.left);
          if (node.right) queue.push(node.right);
        }
        result.push(level);
      }
      return result;
    }
  2. 最短路径问题
    BFS 可以用于无权图的最短路径查找,例如网格中的最短路径:

    js实现bfs

    function shortestPath(grid, start, end) {
      const queue = [[start, 0]];
      const visited = new Set([start.toString()]);
      const directions = [[1, 0], [-1, 0], [0, 1], [0, -1]];
      while (queue.length > 0) {
        const [[x, y], dist] = queue.shift();
        if (x === end[0] && y === end[1]) return dist;
        for (const [dx, dy] of directions) {
          const nx = x + dx, ny = y + dy;
          if (isValid(nx, ny, grid) && !visited.has([nx, ny].toString())) {
            visited.add([nx, ny].toString());
            queue.push([[nx, ny], dist + 1]);
          }
        }
      }
      return -1;
    }

注意事项

  • 对于图结构的 BFS,必须使用 visited 集合避免循环访问。
  • 队列操作的时间复杂度为 O(1),但 shift 方法在 JavaScript 中可能导致 O(n) 时间,可以使用索引优化。
  • 如果节点值需要特殊处理(如对象),需自定义比较逻辑或使用 Map 替代 Set

标签: jsbfs
分享给朋友:

相关文章

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取 jQ…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:CSS…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…