68.树的深度优先遍历与章节编号
树的深度优先遍历与章节编号
题目描述
给定一个树形结构的章节对象,每个节点包含 name 和 children 属性。请实现一个函数 serialize,该函数接收一个树形结构的章节对象,返回一个数组,包含树的深度优先遍历结果。同时,每个章节名称前需要加上对应的序号。
示例
const chapterTree = {
  name: "总章节",
  children: [
    {
      name: "章节一",
      children: [
        {
          name: "第一节",
          children: [{ name: "第一小节" }, { name: "第二小节" }],
        },
        { name: "第二节" },
      ],
    },
    {
      name: "章节二",
      children: [{ name: "第三节" }, { name: "第四节" }],
    },
  ],
};
function serialize(tree) {
  // TODO
}
const result = serialize(chapterTree);
console.log(result);
// ["总章节", "(1)章节一", "(1.1)第一节", "(1.1.1)第一小节", "(1.1.2)第二小节", "(1.2)第二节", "(2)章节二", "(2.1)第三节", "(2.2)第四节"]
提示
TIP
- 实现 serialize 函数: - 该函数接收一个树形结构的章节对象,返回一个数组,包含树的深度优先遍历结果。
- 每个章节名称前需要加上对应的序号,格式为 "(序号)章节名称"。
- 序号的格式为层级结构,例如 1.1.1 表示第一层的第 1 个节点,第二层的第 1 个节点,第三层的第 1 个节点。
 
- 边界情况处理: - 如果树为空,返回一个空数组。
- 如果某个节点没有子节点,只返回该节点的名称和序号。
 
参考答案
DETAILS
function serialize(tree, locate = []) {
  let arr = [];
  let before = locate.length ? `(${locate.join(".")})` : "";
  arr.push(before + tree.name);
  if (tree.children) {
    tree.children.forEach((item, index) => {
      let copyLocal = locate.slice();
      copyLocal.push(index + 1);
      arr.push(...serialize(item, copyLocal));
    });
  }
  return arr;
}
const chapterTree = {
  name: "总章节",
  children: [
    {
      name: "章节一",
      children: [
        {
          name: "第一节",
          children: [{ name: "第一小节" }, { name: "第二小节" }],
        },
        { name: "第二节" },
      ],
    },
    {
      name: "章节二",
      children: [{ name: "第三节" }, { name: "第四节" }],
    },
  ],
};
const result = serialize(chapterTree);
console.log(result);
