在每个树行中找最大值

96 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

说在前面

🎈每天进行一道算法题目练习,今天的题目是“在每个树行中找最大值”,二叉树的题目我们已经做过很多了,今天这道题目也是比较简单的,对二叉树进行一次遍历就可以得出答案了。

问题描述

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

示例1:

image.png

输入: 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前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。