# 栈与深度优先搜索(DFS)

与 BFS 类似,深度优先搜索(DFS)也可用于查找从根结点到目标结点的路径。
与 BFS 不同,更早访问的结点可能不是更靠近根结点的结点。因此,你在 DFS 中找到的第一条路径可能不是最短路径。条路径并不总是最短的路径。

/*
 * Return true if there is a path from cur to target.
 */
function DFS(root, target) {
  if (!root) return false;
  let set = new Set();

  function loop(node, target) {
    if (node) {
      if (node.id === target) return true;
      if (!set.has(node)) {
        set.add(node);
        if (node.children) {
          for (let i = 0, len = node.children.length; i < len; i++) {
            const cur = node.children[i];
            if (loop(cur, target)) return true;
          }
        }
      }
    }
  }

  if (Array.isArray(root)) {
    for (let i = 0, len = root.length; i < len; i++) {
      if (loop(root[i], target)) return true;
    }
  } else {
    if (loop(root, target)) return true;
  }
  return false;
}
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(DFS(data, 'g')); // true