leetcode513. 找树左下角的值

给定一个二叉树的 根节点 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
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值