【发布时间】:2016-10-01 11:16:09
【问题描述】:
我正在使用cytoscape.js 创建图表。
我想穿过节点(有方向),但只到那些与包含特定值的边相连的节点。
我已经用这样的递归做到了
function traverse(node, requiredValue, visitedNodes) {
// break if we visit a node twice
if (visitedNodes.map(visitedNode => visitedNode.id()).includes(node.id())) {
return visitedNodes;
}
// add visited node to collection
visitedNodes.push(node);
// select node
node.select();
// only travel through valid edges
const edgesTo = node.outgoers(function () {
return this.isEdge() && this.data('requiredValues').includes(requiredValue);
});
// break if no valid connected edges
if (edgesTo.empty()) {
return visitedNodes;
}
// travel through edges
edgesTo.forEach(edge => {
edge.select()
return traverse(edge.target(), agent, visitedNodes);
});
}
它似乎有效,但我不太擅长算法,所以我不确定这是否是构建它的聪明方法。我读过一些关于广度优先和深度优先搜索算法的文章,但我不确定是否是我需要的那些算法。
是否可以在不使用递归的情况下遍历树?我也尝试过使用while 循环,但由于它是一棵树,我认为我不能只使用
node = rootNode;
while (true) {
// find leaving edges
...
edgesTo.forEach(edge => {
// set new node to traverse
node = edge.target;
}
}
因为我猜edgesTo.forEach() 将在进入while 循环中的下一个迭代之前完成。我需要它“同时”遍历不同的分支。
我可以从http://js.cytoscape.org/#collection/algorithms 看到该库有多种算法(包括 bfs 和 dfs),但是当我想遍历树而不是搜索特定节点时是否需要这些算法?
【问题讨论】:
标签: javascript algorithm tree graph-algorithm cytoscape.js