leetcode刷题记录-589. N 叉树的前序遍历

158 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

前言

今天的题目为简单,但是我们能够见到另一种 Node 的结点类型,跟之前做过的结点题有点相似有不太一样。

每日一题

今天的每日一题 798. 得分最高的最小轮调,难度为简单

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

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

示例 1:

image.png

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

示例 2:

image.png

输入: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, 104]内
  • 0 <= Node.val <= 104
  • n 叉树的高度小于或等于 1000

题解

递归

Node 节点树

这道题涉及到了一个比较少见的 js 知识点,Node类型,我们做题之前首先要知道 Node 类型是什么,具体的话,我们之前的刷题纪录已经刷过 Node 类型的题目了。

但是根据题目给我们的注释,节点的内容有不太一样,根据题目的注释我们可以得知这道题中的节点内容

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

里面含有一个 val 代表的是节点的值,还有一个 children 的数组代表的是子节点的数组。

树的遍历

题目需要我们去返回树的前序遍历,既然需要前序遍历,那么就要先去知道,什么是前序遍历

对于一颗树来说,我们大多时候会用递归的方式来描述它的结构,并且对于一颗树来说,它的前序遍历就是:一直去寻找当前节点的左孩子,不存在左孩子就去找右孩子,左右都找到后会去往父节点。

image.png

比如这样一颗树,对于它的前序遍历就是 1,2,4,5,3,6。我们从 1 开始,一直去找它的左孩子,知道不存在左孩子了,就去找右孩子,左右都找完之后,就去往上一级。

比如上面这个树,一开始为 1 节点,它的左孩子为 2, 2 这个节点的左孩子为 4,然后 4 不存在左孩子了,就会去找右孩子,4 的右孩子为 5,左右孩子都找完之后,去往上一级也就是 1,去找 1 的右孩子,也就是 3,然后重复去找 3 的左孩子,也就是 6,接着 3 已经不存在右孩子了,我们已经遍历完这颗树了,那么也就拿到了前序遍历的过程。

递归解题

那么我们是不是可以用递归来描述上面这个过程,由于题目给的数据就是从左往右的,刚好满足左孩子右孩子的顺序,那么我们就不要去处理顺序问题,那么我们只要去判断当前节点是否有孩子,优化的就需要递归再去判断这个孩子的孩子是否还有左右孩子,如此深度遍历一遍节点,就能够拿到前序遍历。

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

/**
 * @param {Node|null} root
 * @return {number[]}
 */
 var preorder = function(root) {
    const res = new Array()
    dfs = function(node) {
        if(node != null) {
            res.push(node.val)
            for(const child of node.children)
                dfs(child)
        }
    }
    dfs(root)
    return res
};

image.png