力扣【二叉树专题】👊 589. N 叉树的前序遍历

156 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 3 天,点击查看活动详情

题目链接

589. N 叉树的前序遍历 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

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

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

测试用例

示例 1:

image.png

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

限制

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

题目分析

首先,分享一下二叉树的标准的递归遍历代码

function trave(node) {
    if (node == null) return;
    // (1)
    trave(node.left);
    // (2)
    trave(node.right);
    // (3)
}

在遍历节点的过程中,对 当前节点 的处理的代码块

  • 放在位置 (1) 是为前序遍历,表示在遍历当前节点的子节点之前,需要为此节点做一些业务操作
  • 放在位置 (2) 为中序遍历,表示遍历完此节点的左子节点后,为此节点执行一些操作,最后再去遍历他的右子节点
  • 放在位置 (3) 则是后续遍历,表示在遍历完当前节点的子节点后,追加一些操作

那么,由此推广而来的 N叉树 遍历的模版则如下:

function trave(node) {
    if (node == null) return;
    // (1)
    node.children.forEach(n => trave(n))
    // (3)
}

同样的,在 (1) 位置的业务操作为 N叉树 的前序遍历;在 (2) 的位置的业务操作为 N叉树 的后序遍历

代码实现

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

var preorder = function(root) {
    let arr = [];
    trave(root);
    return arr;

    function trave(node) {
        if (node == null) return;
        arr.push(node.val);
        for (let i = 0; i < node.children.length; i++) {
            trave(node.children[i])
        }
    }
};

image.png