Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
遍历树javascript_Javascript_Algorithm - Fatal编程技术网

遍历树javascript

遍历树javascript,javascript,algorithm,Javascript,Algorithm,我正在尝试用javascript遍历一个图形。我的工作是遍历和解析下图中所有可能的结果 这就是我在JS对象中存储图形的方式 var graph = { alpha: { in: [], out: ['a', 'b'] }, a: { in: ['alpha'], out: [] }, b: { in: ['alpha'], out: ['c', 'e']

我正在尝试用javascript遍历一个图形。我的工作是遍历和解析下图中所有可能的结果

这就是我在JS对象中存储图形的方式

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"]]