递归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;
}