Spaces:
Build error
Build error
| import * as _ from 'lodash-es'; | |
| export { dfs }; | |
| /* | |
| * A helper that preforms a pre- or post-order traversal on the input graph | |
| * and returns the nodes in the order they were visited. If the graph is | |
| * undirected then this algorithm will navigate using neighbors. If the graph | |
| * is directed then this algorithm will navigate using successors. | |
| * | |
| * Order must be one of "pre" or "post". | |
| */ | |
| function dfs(g, vs, order) { | |
| if (!_.isArray(vs)) { | |
| vs = [vs]; | |
| } | |
| var navigation = (g.isDirected() ? g.successors : g.neighbors).bind(g); | |
| var acc = []; | |
| var visited = {}; | |
| _.each(vs, function (v) { | |
| if (!g.hasNode(v)) { | |
| throw new Error('Graph does not have node: ' + v); | |
| } | |
| doDfs(g, v, order === 'post', visited, navigation, acc); | |
| }); | |
| return acc; | |
| } | |
| function doDfs(g, v, postorder, visited, navigation, acc) { | |
| if (!_.has(visited, v)) { | |
| visited[v] = true; | |
| if (!postorder) { | |
| acc.push(v); | |
| } | |
| _.each(navigation(v), function (w) { | |
| doDfs(g, w, postorder, visited, navigation, acc); | |
| }); | |
| if (postorder) { | |
| acc.push(v); | |
| } | |
| } | |
| } | |