「这是我参与2022首次更文挑战的第 24 天,活动详情查看:2022首次更文挑战」
题目链接
515. 在每个树行中找最大值 - 力扣(LeetCode) (leetcode-cn.com)
题目描述
给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。
测试用例
示例 1:
输入: 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;
};
解法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);
}
};