589. N 叉树的前序遍历

简介: 589. N 叉树的前序遍历

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。

题目描述

给定一个 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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

目录
相关文章
08_N叉树的层序遍历
08_N叉树的层序遍历
|
6月前
|
算法
【力扣】94. 二叉树的中序遍历、144. 二叉树的前序遍历、145. 二叉树的后序遍历
【力扣】94. 二叉树的中序遍历、144. 二叉树的前序遍历、145. 二叉树的后序遍历
|
6月前
|
存储
什么?二叉树的反前序遍历?
什么?二叉树的反前序遍历?
|
6月前
二叉树的中序遍历
二叉树的中序遍历
40 0
|
6月前
|
C++
二叉树的前序遍历(C++)
二叉树的前序遍历(C++)
49 0
二叉树的前序遍历(C++)
|
存储 搜索推荐
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(下)
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(下)
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(上)
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(上)