持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情
题目
给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
示例 1:
输入: root = [2,1,3]
输出: 1
示例 2:
输入: [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)。