LeetCode探索(99):513-找树左下角的值

145 阅读1分钟

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

题目

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

示例 1:

img

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

示例 2:

img

输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7

提示:

  • 二叉树的节点个数的范围是 [1,10^4]
  • -2^31 <= Node.val <= 2^31 - 1

思考

本题难度中等。

首先是读懂题意。给定一个二叉树的 根节点 root,树左下角的值指的是该二叉树的 最底层 最左边 节点的值。

我们可以借助深度优先搜索去解题。也就是,我们可以使用变量 curHeight 记录我们所遍历到的节点的高度,curVal 记录高度在 curHeight 时的最左节点的值。

在我们进行深度优先搜索时,我们先搜索当前节点的左子节点,再搜索当前节点的右子节点,然后判断当前节点的高度 height 是否大于 curHeight,如果是,那么将 curVal 设置为当前结点的值,curHeight 设置为 height。考虑到我们是先遍历左子树,然后再遍历右子树,只有当高度大于 curHeight 时才更新 curHeight 和 curVal 的值,所以对于二叉树的所有节点,我们经过遍历后最终得到的就是最底层、最左节点的值。

解答

方法一:深度优先搜索

/**
 * @param {TreeNode} root
 * @return {number}
 */
var findBottomLeftValue = function(root) {
  const dfs = (root, height) => {
    if (!root) {
      return
    }
    height++
    dfs(root.left, height)
    dfs(root.right, height)
    if (height > curHeight) {
      curHeight = height
      curVal = root.val
    }
  }
  let curHeight = 0, curVal = 0
  dfs(root, 0)
  return curVal
}

复杂度分析:

  • 时间复杂度:O(n),其中 n 为二叉树的节点数目。
  • 空间复杂度:O(n)。

参考