遍历树javascript
我正在尝试用javascript遍历一个图形。我的工作是遍历和解析下图中所有可能的结果 这就是我在JS对象中存储图形的方式遍历树javascript,javascript,algorithm,Javascript,Algorithm,我正在尝试用javascript遍历一个图形。我的工作是遍历和解析下图中所有可能的结果 这就是我在JS对象中存储图形的方式 var graph = { alpha: { in: [], out: ['a', 'b'] }, a: { in: ['alpha'], out: [] }, b: { in: ['alpha'], out: ['c', 'e']
var graph = {
alpha: {
in: [],
out: ['a', 'b']
},
a: {
in: ['alpha'],
out: []
},
b: {
in: ['alpha'],
out: ['c', 'e']
},
c: {
in: ['b'],
out: ['d']
},
d: {
in: ['c'],
out: []
},
e: {
in: ['b'],
out: ['f', 'g']
},
f: {
in: ['e'],
out: []
},
g: {
in: ['e'],
out: []
}
};
我需要解析它以获得以下输出
output = [
['alpha', 'a'],
['alpha', 'b', 'c', 'd'],
['alpha', 'b', 'e', 'f'],
['alpha', 'b', 'e', 'g']
];
需要注意的关键事项是:
alpha
始终是父节点李>
一个
输入连接,并且最多有n个
-输出连接数var getChild = function (Obj) {
if ( Obj['out'].length == 0){
console.log('END');
return
}else{
var shifted = Obj['out'].shift();
console.log(shifted);
return getChild(graph[shifted]);
}
}
有谁能指导我以最高效的方式遍历图形吗?您可以按以下方式以深度优先的方式遍历您的树:
var traverse = function(tree, current) {
//process current node here
//visit children of current
for (var cki in current.out) {
var ck = current.out[cki];
var child = tree[ck];
traverse(tree, child);
}
}
//call on root node
traverse(graph, graph["alpha"]);
[编辑:上面的错误]
然而,树的平面布局有什么特别的原因吗?JS允许您任意嵌套数据,因此您可以
var graph = {
alpha: {
a: {},
b: {
c: {
d: {}
},
e: {
f: {},
g: {}
}
}
}
}
现在只处理节点本身,不需要引用。这使得循环(这将破坏上述函数)不可能。
要遍历此树,可以将遍历函数简化为仅传递当前节点:
var traverse2 = function(current) {
//process current node here
console.log('visiting ' + current);
//visit children of current
for (var ck in current) {
var child = current[ck];
traverse2(child);
}
}
//call on root node
traverse(graph);
仅使用ES5,我将坚持保证图形中没有循环,并使用数组方法“解析”:
function pathsFrom(vertex) {
if (vertex.out.length === 0) return [[vertex]];
var pathsOfEachChild = vertex.out.map(pathsFrom),
flatListOfPaths = pathsOfEachChild.reduce(function (flat, branch) {
return flat.concat(branch);
}),
withVertexPrepended = flatListOfPaths.map(function (path) {
return [vertex].concat(path);
});
return withVertexPrepended;
}
运行测试(自由地给顶点一个toString
)并获得
不确定是否正确解释问题?只遍历了
out
属性?为什么[alpha,b,e,g]
包含e
?节点g
有一个自循环。感谢fior,pinter@SamsegerFirst代码块的for
枚举数组的键,而不是您想要的元素。在JS中,for(var i in)导致i获取数组元素的连续索引,因此cki为“子键索引“。实际上,代码中有一个不同的错误。啊哈,我没有注意到,I
回到了索引的位置。我的错。@ferry你能编辑函数以返回2D数组吗?@Fawzan不知道你的意思。你是指.out属性中的邻接信息吗?该函数是递归函数,是否希望它累积该信息?
[["alpha", "a"], ["alpha", "b", "c", "d"], ["alpha", "b", "e", "f"], ["alpha", "b", "e", "g"]]