68.树的深度优先遍历与章节编号

书诚小驿2025/10/21前端面经算法JavaScript

树的深度优先遍历与章节编号

题目描述

给定一个树形结构的章节对象,每个节点包含 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

  1. 实现 serialize 函数:
    • 该函数接收一个树形结构的章节对象,返回一个数组,包含树的深度优先遍历结果。
    • 每个章节名称前需要加上对应的序号,格式为 "(序号)章节名称"。
    • 序号的格式为层级结构,例如 1.1.1 表示第一层的第 1 个节点,第二层的第 1 个节点,第三层的第 1 个节点。
  2. 边界情况处理:
    • 如果树为空,返回一个空数组。
    • 如果某个节点没有子节点,只返回该节点的名称和序号。

参考答案

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);
最后更新时间' 2025/2/23 01:48:16