说在前面
🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。
题目描述
给定一个 n 叉树的根节点 root
,返回 其节点值的 前序遍历 。
n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null
分隔(请参见示例)。
示例 1:
输入: root = [1,null,3,2,4,null,5,6] 输出: [1,3,5,6,2,4]
示例 2:
输入: root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14] 输出: [1,2,3,6,7,11,14,4,8,12,5,9,13,10]
提示:
- 节点总数在范围
[0, 10^4]
内 0 <= Node.val <= 10^4
- n 叉树的高度小于或等于
1000
解题思路
N 叉树是一种特殊的树结构,每个节点可以有多个子节点。在前序遍历中,遍历顺序为:根节点 -> 左子树 -> 右子树(对于 N 叉树,先遍历左侧子树,再遍历右侧子树)。
这段代码首先判断根节点是否为空,如果为空则直接返回一个空数组。否则,定义一个结果数组 res 和一个待遍历节点数组 arr,将根节点加入数组 arr 中。
然后进行 while 循环,每次弹出 arr 数组最末尾的节点 cur,将其值加入结果数组 res 中。接着,倒序遍历 cur 的子节点,将它们按顺序加入数组 arr 中。循环结束后,返回结果数组 res。
该算法的时间复杂度为 O(n),其中 n 是 N 叉树中节点的数量。空间复杂度也是 O(n),因为需要存储所有节点。
AC代码
/** * // Definition for a Node. * function Node(val, children) { * this.val = val; * this.children = children; * }; */ /** * @param {Node|null} root * @return {number[]} */ var preorder = function(root) { if (root === null) { return [] } const res = [] const arr = [root] while (arr.length) { const cur = arr.pop() res.push(cur.val) for (let i = cur.children.length - 1; i >= 0; i--) { arr.push(cur.children[i]) } } return res; };
公众号
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。