持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 7 天,点击查看活动详情
题目链接
题目描述
给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。
n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
测试用例
示例 1:
输入: root = [1,null,3,2,4,null,5,6]
输出: [5,6,3,2,4,1]
限制
- 节点总数在范围 内
- 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);
}
};
一看双 O 耗时不对劲,仔细检查一把代码,发现是用了 foreach 的原因,将他改造成传统的 for 循环,效率立马接近双百
在网上搜索了一下,原文如下:
forEach 在内部包含许多检查,不像简单的循环那样直接.
有关详细信息,请参阅 Mozilla Javascript 参考: