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);