# 队列和广度优先搜索(BFS)

广度优先搜索(BFS)的一个常见应用是找出从根结点到目标结点的最短路径。

BFS 从根节点开始,每轮将一层节点加入队列,并在下一轮移除队列。
如果在第 k 轮中将结点 X 添加到队列中,则根结点与 X 之间的最短路径的长度恰好是 k。也就是说,第一次找到目标结点时,你已经处于最短路径中。
结点的处理顺序与它们添加到队列的顺序是完全相同的顺序,即先进先出(FIFO)。这就是我们在 BFS 中使用队列的原因。

function BFS(root, target) {
  if (!root) {
    return;
  }
  let step = 0;
  let set = new Set();
  let list = Array.isArray(root) ? root : [root];
  while (list.length) {
    step++;
    let len = list.length;
    for (let i = 0; i < len; i++) {
      let cur = list[0];
      if (cur.id === target) {
        return step;
      }
      if (cur.children) {
        for (let j = 0, childLen = cur.children.length; j < childLen; j++) {
          let curChildren = cur.children[j];
          if (!set.has(curChildren)) {
            set.add(curChildren);
            list.push(curChildren);
          }
        }
      }
      list.shift();
    }
  }
  return -1;
}
const nodeE = { id: 'e' };
const nodeG = { id: 'g' };
const data = {
  id: 'a',
  children: [
    { id: 'b', children: [nodeE] },
    { id: 'c', children: [nodeE, { id: 'f', children: [nodeG] }] },
    { id: 'd', children: [nodeG] }
  ]
};
// debugger;
console.log(BFS(data, 'g')); // 3