给定一个二叉树的 根节点
root
,请找出该二叉树的 最底层 最左边 节点的值。假设二叉树中至少有一个节点。
示例 1:
输入: root = [2,1,3] 输出: 1示例 2:
输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7提示:
- 二叉树的节点个数的范围是
[1,104]
-231 <= Node.val <= 231 - 1
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
// 搜索
// 1、我们使用前序遍历,优先进行左边搜索,判断当前是否是最大深度,当前结点是否是最左边的结点。
// 2、我们可以设置2个全局变量,一个记录最大深度,一个记录当前深度。当结点是叶子结点,且其所处深度比已记录的最大深度大时,我们就更新最左值和最大深度值。
// 3、同深度下只会进行一次值的更新,由于是前序遍历,这唯一一次更新的最左值就是此深度下最左边的值。
// 4、这样递归完成后,我们就已经找到这颗树最左下角的值了。
var findBottomLeftValue = function(root) {
// 记录最大深度,初值设置为负无穷,方便比较
let maxLevel = -Infinity,
// 当前深度
curLevel = 0,
// 最左值
maxLeftVal = 0
// 前序遍历
let preOrderTraversal = function(node){
// 如果结点不存在则返回
if(!node) return
// 当前深度递增
curLevel++
// 当结点是叶子结点,且当前深度最大时,它便是树最左下角的结点。
// 前序遍历优先搜索左边的值,同深度下,最左边的结点最先被搜索到
// 同深度下,此判断语句内的代码只会被执行一次
if(curLevel > maxLevel && !node.left && !node.right){
// 记录最大深度
maxLevel = curLevel
// 记录最左值
maxLeftVal = node.val
}
// 遍历左子树
node.left && preOrderTraversal(node.left)
// 遍历右子树
node.right && preOrderTraversal(node.right)
// 回溯,深度递减
curLevel--
}
// 从根结点开始向下遍历
preOrderTraversal(root)
return maxLeftVal
};