Javascript Tree Traversal Algorithm

后端 未结 2 789
长发绾君心
长发绾君心 2021-02-06 10:52

I need help traversing a tree structure in a depth first fashion. I can\'t come up with an algorithm to do it properly.

My input is this:

[
    [\"A\",          


        
相关标签:
2条回答
  • 2021-02-06 11:24

    What you're looking for is the cartesian product of a list of lists, it has been asked before. Borrowing from the accepted answer for that question, you can do this in Javascript 1.7:

    function product() {
        return Array.prototype.reduce.call(arguments, function(as, bs) {
            return [a.concat(b) for each (a in as) for each (b in bs)];
        }, [[]]);
    };
    
    function convert(lst) {
      var solution = [];
      for (var i = 0; i < lst.length; i++) {
        solution.push(lst[i][0] + "/" + lst[i][1] + "/" + lst[i][2]);
      }
      return solution;
    };
    
    convert(product(["A", "B", "C"], ["1", "2"], ["a", "b", "c", "d"]));
    
    > ["A/1/a", "A/1/b", "A/1/c", "A/1/d",
       "A/2/a", "A/2/b", "A/2/c", "A/2/d",
       "B/1/a", "B/1/b", "B/1/c", "B/1/d",
       "B/2/a", "B/2/b", "B/2/c", "B/2/d",
       "C/1/a", "C/1/b", "C/1/c", "C/1/d",
       "C/2/a", "C/2/b", "C/2/c", "C/2/d"]
    
    0 讨论(0)
  • 2021-02-06 11:47

    This should do the job:

    function traverse(arr) {
      var first = arr[0];
      var ret = [];
      if (arr.length == 1) {
        for (var i = 0; i < first.length; i++) {
          ret.push(first[i]);
        }
      } else {
        for (var i = 0; i < first.length; i++) {
          var inn = traverse(arr.slice(1));
          for (var j = 0; j < inn.length; j++) {
            ret.push(first[i] + '/' + inn[j]);
          }
        }
      }
      return ret;
    }
    
    var inp = [
      ["A", "B", "C"],
      ["1", "2"],
      ["a", "b", "c", "d"]
    ];
    
    var out = traverse(inp);
    
    console.log(out);

    0 讨论(0)
提交回复
热议问题