力扣【二叉树专题】590. N 叉树的后序遍历

68 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 7 天,点击查看活动详情

题目链接

590. N 叉树的后序遍历 - 力扣(LeetCode)

题目描述

给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历

n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。

测试用例

示例 1:

image.png

输入: root = [1,null,3,2,4,null,5,6]
输出: [5,6,3,2,4,1]

限制

  • 节点总数在范围 [0,104][0, 10^4]
  • 0<=Node.val<=1040 <= Node.val <= 10^4
  • n 叉树的高度小于或等于 1000

题目分析

对二叉树的常规处理有以下的 3 个位置:

function trave(node) {
    if (node == null) return;
    // (1)
    trave(node.left);
    // (2)
    trave(node.right);
    // (3)
}
  • 放在位置 (1) 是为前序遍历,表示在遍历当前节点的子节点之前,需要为此节点做一些业务操作
  • 放在位置 (2) 为中序遍历,表示遍历完此节点的左子节点后,为此节点执行一些操作,最后再去遍历他的右子节点
  • 放在位置 (3) 则是后续遍历,表示在遍历完当前节点的子节点后,追加一些操作

因此,n 叉树的后续遍历,业务代码应该写在 (3)

代码实现

指定一个数组变量 arr, 在上述模板的 (3) 的地方将当前 node.val 添加到 arr 中,最后返回 arr,代码如下:

/**
 * // Definition for a Node.
 * function Node(val,children) {
 *    this.val = val;
 *    this.children = children;
 * };
 */

/**
 * @param {Node|null} root
 * @return {number[]}
 */
var postorder = function(root) {
    let arr= [];
    trave(root);
    return arr;
    function trave(node){
        if(node == null)return;
        node.children.forEach(n=>trave(n));
        arr.push(node.val);
    }
};

image.png

一看双 O 耗时不对劲,仔细检查一把代码,发现是用了 foreach 的原因,将他改造成传统的 for 循环,效率立马接近双百

image.png


在网上搜索了一下,原文如下:

forEach 在内部包含许多检查,不像简单的循环那样直接.
有关详细信息,请参阅 Mozilla Javascript 参考: