持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情
说在前面
🎈每天进行一道算法题目练习,今天的题目是“在每个树行中找最大值”,二叉树的题目我们已经做过很多了,今天这道题目也是比较简单的,对二叉树进行一次遍历就可以得出答案了。
问题描述
给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。
示例1:
输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]
示例2:
输入: root = [1,2,3]
输出: [1,3]
提示:
二叉树的节点个数的范围是 [0,10^4]
-2^31 <= Node.val <= 2^31 - 1
思路分析
题目描述很简单,我们可以很快的得出题目要求我们做的事情,题目的意思是要我们统计二叉树中每一层的最大节点值,并使用一个数组返回每一层的最大值。
如示例1:
看图片的话我们可以很快的得出答案是[1,3,9],元素i代表第i+1层的最大值,那么代码应该怎么写呢?
- 1、声明一个数组保存答案
let res = [];
- 2、递归遍历二叉树 二叉树的遍历方式有很多,大家可以选择自己比较喜欢的方式进行遍历,这里我使用了最常见的前序遍历的方式来进行二叉树遍历,遍历过程中需要传递当前遍历节点的层级信息。
let dfs = function(r,f){
if(!r) return;
//更新最大值
if(r.left) dfs(r.left,f + 1);
if(r.right) dfs(r.right,f + 1);
}
- 3、更新最大值 在遍历的过程中,我们需要知道当前遍历节点的层数,并更新当前层级的最大值。
//f为当前节点的层级
res[f] != undefined ? res[f] = Math.max(res[f],r.val) : res.push(r.val);
AC代码
完整的AC代码如下:
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var largestValues = function(root) {
let res = [];
let dfs = function(r,f){
if(!r) return;
res[f] != undefined ? res[f] = Math.max(res[f],r.val) : res.push(r.val);
if(r.left) dfs(r.left,f + 1);
if(r.right) dfs(r.right,f + 1);
}
dfs(root,0);
return res;
};
说在后面
🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。