Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
前言
今天的题目为简单,但是我们能够见到另一种 Node 的结点类型,跟之前做过的结点题有点相似有不太一样。
每日一题
今天的每日一题 798. 得分最高的最小轮调,难度为简单
-
给定一个 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, 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 的数组代表的是子节点的数组。
树的遍历
题目需要我们去返回树的前序遍历,既然需要前序遍历,那么就要先去知道,什么是前序遍历
对于一颗树来说,我们大多时候会用递归的方式来描述它的结构,并且对于一颗树来说,它的前序遍历就是:一直去寻找当前节点的左孩子,不存在左孩子就去找右孩子,左右都找到后会去往父节点。
比如这样一颗树,对于它的前序遍历就是 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
};