LeetCode探索(101):515-在每个树行中找最大值

70 阅读1分钟

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

题目

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

示例1:

img

输入: 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 表示二叉树的高度。

参考