持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情
题目
给定一棵二叉树的根节点 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
思考
本题难度中等。
首先是读懂题意。题目中给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。
我们可以使用深度优先搜索来解决问题。我们使用 curHeight 来标记遍历到的当前节点的高度。当遍历到 curHeight 高度的节点就判断是否更新该层节点的最大值。最后,将各个高度的节点中的最大值存入数组 res 即可。
考虑到二叉树的深度优先搜索遍历过程中,二叉树的每个节点会被访问一次且只会被访问一次,因此时间复杂度是O(n)。
解答
方法一:深度优先搜索
/**
* @param {TreeNode} root
* @return {number[]}
*/
var largestValues = function(root) {
if (!root) {
return []
}
const res = []
const dfs = (res, root, curHeight) => {
if (curHeight === res.length) {
res.push(root.val)
} else {
res.splice(curHeight, 1, Math.max(res[curHeight], root.val))
}
if (root.left) {
dfs(res, root.left, curHeight + 1)
}
if (root.right) {
dfs(res, root.right, curHeight + 1)
}
}
dfs(res, root, 0)
return res
}
// 执行用时:64 ms, 在所有 JavaScript 提交中击败了96.92%的用户
// 内存消耗:46.1 MB, 在所有 JavaScript 提交中击败了15.30%的用户
// 通过测试用例:78 / 78
复杂度分析:
- 时间复杂度:O(n),其中 n 为二叉树节点个数。
- 空间复杂度:O(height)。其中 height 表示二叉树的高度。