递归tree

最近在工作中遇到tree的节点是否能选择其他节点作为父节点的问题,下面简单描述一下问题:
一个无环有向树形数据结构,本身是有方向的,可以看做具有流的性质,也就是说子节点必须发生在父节点之后,
现在的需求是将这个树变成有环有向树,但是不允许出现有向环(也就是从某个顶点出发无法回到该顶点)

具体思路:深度优先搜索来判断是否存在环

function hasCycle(graph) {
  const visited = new Set();
  const stack = new Set();

  function dfs(node) {
    if (stack.has(node)) {
      return true; // 当前节点在递归堆栈中,表示存在环
    }
    if (visited.has(node)) {
      return false; // 当前节点已经被访问过,不存在环
    }

    visited.add(node); // 标记当前节点为已访问
    stack.add(node); // 将当前节点添加到递归堆栈中

    for (let neighbor of graph[node] || []) {
      if (dfs(neighbor)) {
        return true;
      }
    }

    stack.delete(node); // 当前节点递归结束,从堆栈中移除
    return false;
  }

  for (let node in graph) {
    if (dfs(node)) {
      return true;
    }
  }

  return false;
}

辅助函数 dfs遍历树

const findAllNode = (tree) => {
    const nodes = [];
    const dfs = (node) => {
        nodes.push(node.id);
        nodes.children.forEach(child => dfs(child));
    }
    dfs(tree);
    return nodes;
}