67.树的深度优先遍历
树的深度优先遍历与章节编号
题目描述
给定一个树形结构的章节对象,每个节点包含 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
- 实现 serialize 函数:
- 该函数接收一个树形结构的章节对象,返回一个数组,包含树的深度优先遍历结果。
- 每个节点的名称直接添加到结果数组中,不带任何编号。
- 序号的格式为层级结构,例如 1.1.1 表示第一层的第 1 个节点,第二层的第 1 个节点,第三层的第 1 个节点。
- 边界情况处理:
- 如果树为空,返回一个空数组。
- 如果某个节点没有子节点,只返回该节点的名称。
参考答案
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);