力扣【二叉树专题】👊 515. 在每个树行中找最大值

136 阅读2分钟

「这是我参与2022首次更文挑战的第 24 天,活动详情查看:2022首次更文挑战

题目链接

515. 在每个树行中找最大值 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

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

测试用例

示例 1:

image.png

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

示例 2:

输入: root = [1,2,3]
输出: [1,3]

题目分析

题目需要我们获取二叉树中,每一层中最大的节点的值

这种明确需要对二叉树按层遍历的类型,就是典型的广度搜索题型

我们通过一个数组来辅助遍历二叉树,遍历到每一层时,初始化一个变量 max,用于记录当前层最大的节点的值。每当遍历当前层一个节点,就比较并更新 max 的值

最后,我们将记录到的每层的最大值,合并到一个数组并返回,即为题目所需

代码实现

var largestValues = function(root) {
    if (root == null) return [];
    let nodes = [root],
        len = nodes.length;
    let maxArr = [];
    while (len > 0) {
        let max = -Number.MAX_VALUE;
        for (; len > 0; len--) {
            let curr = nodes.shift();
            max = Math.max(max, curr.val);
            if (curr.left != null) nodes.push(curr.left);
            if (curr.right != null) nodes.push(curr.right);
        }
        maxArr.push(max);
        len = nodes.length;
    }
    return maxArr;
};

image.png

解法2

凡是二叉树,都可以使用递归的方式来遍历。

题目需要我们求每层的最大值,可以转化为,我们尽量求出二叉树中同深度的最大值

我们使用 maxArr 记录每层的最大值,maxArr 中的下标就对应在二叉树中第几层的最大值。我们要做的就是,在递归遍历二叉树的时候,判断并更新 maxArr 中对应的下标的最大值

var largestValues = function(root) {
    let maxArr = [];
    trave(root, 0);
    return maxArr;

    function trave(node, deep) {
        if (node == null) return;
        if (maxArr[deep] == undefined) {
            maxArr.push(node.val);
        } else {
            maxArr[deep] = Math.max(maxArr[deep], node.val);
        }
        deep++;
        trave(node.left, deep);
        trave(node.right, deep);
    }
};

image.png