67.树的深度优先遍历

书诚小驿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);
// ["总章节", "章节一", "第一节", "第一小节", "第二小节", "第二节", "章节二", "第三节", "第四节"]

提示

TIP

  1. 实现 serialize 函数:
    • 该函数接收一个树形结构的章节对象,返回一个数组,包含树的深度优先遍历结果。
    • 每个节点的名称直接添加到结果数组中,不带任何编号。
    • 序号的格式为层级结构,例如 1.1.1 表示第一层的第 1 个节点,第二层的第 1 个节点,第三层的第 1 个节点。
  2. 边界情况处理:
    • 如果树为空,返回一个空数组。
    • 如果某个节点没有子节点,只返回该节点的名称。

参考答案

DETAILS
function serialize(tree) {
  let arr = [];

  // 定义一个递归函数来遍历树
  function dfs(node) {
    if (!node) return;
    arr.push(node.name); // 将当前节点的名称添加到结果数组中
    if (node.children) {
      node.children.forEach((child) => {
        dfs(child); // 递归遍历子节点
      });
    }
  }

  dfs(tree); // 从根节点开始遍历
  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