将DFS列表转换为树

时间:2020-02-07 21:23:12

标签: javascript

考虑以下树:

[
  { 
    id: 0,
    children: [
      { 
        id: 1,
        id: 2 
      }
    ]
  },
  {
    id: 3,
    children: [
      { id: 4 },
      { id: 5,
        children: [
          {
            id: 6,
            id: 7 
          }
        ] 
      }
    ]
  }
];

DFS Walker生成以下列表:

[
  { id: 0, isLeaf: false, nestingLevel: 0 },
  { id: 1, isLeaf: true, nestingLevel: 1 },
  { id: 2, isLeaf: true, nestingLevel: 1 },
  { id: 3, isLeaf: false, nestingLevel: 0 },
  { id: 4, isLeaf: true, nestingLevel: 1 },
  { id: 5, isLeaf: false, nestingLevel: 1 },
  { id: 6, isLeaf: true, nestingLevel: 2 },
  { id: 7, isLeaf: true, nestingLevel: 2 }
];

假设我们可以有两个以上的嵌套级别,如何从生成的列表中还原原始树?

1 个答案:

答案 0 :(得分:3)

假设您想要具有singel id属性的对象,则可以为相同级别获取一个辅助数组,并将与该对象一起的分配存储到以下子级别。

var data = [{ id: 0, isLeaf: false, nestingLevel: 0 }, { id: 1, isLeaf: true, nestingLevel: 1 }, { id: 2, isLeaf: true, nestingLevel: 1 }, { id: 3, isLeaf: false, nestingLevel: 0 }, { id: 4, isLeaf: true, nestingLevel: 1 }, { id: 5, isLeaf: false, nestingLevel: 1 }, { id: 6, isLeaf: true, nestingLevel: 2 }, { id: 7, isLeaf: true, nestingLevel: 2 }],
    result = [],
    levels = [result];

data.forEach(({ id, isLeaf, nestingLevel }) => levels[nestingLevel].push(isLeaf
    ? { id }
    : { id, children: levels[nestingLevel + 1] = [] }
));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

版本略有不同,不使用isLeaf,而存储时没有children属性。

此属性仅在必要时为嵌套级别生成。

var data = [{ id: 0, nestingLevel: 0 }, { id: 1, nestingLevel: 1 }, { id: 2, nestingLevel: 1 }, { id: 3, nestingLevel: 0 }, { id: 4, nestingLevel: 1 }, { id: 5, nestingLevel: 1 }, { id: 6, nestingLevel: 2 }, { id: 7, nestingLevel: 2 }],
    result = [],
    levels = [result];

data.forEach(({ id, nestingLevel: l }) => {
    if (!levels[l]) levels[l] = levels[l - 1][levels[l - 1].length - 1].children = [];
    levels[l].push({ id });
    levels.length = l + 1;
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

相关问题