找树左下角的值

74 阅读1分钟

题目描述

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

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

示例 1:

image.png

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

思路

  1. 最底层:深度最大
  2. 最左边:从左往右第一个节点
  3. 确认遍历顺序:前中后序遍历均可,因为不涉及到中间节点的处理,且无论哪种遍历方式,左始终在右之前。
  4. 这里采用递归的方式来做,确定终止条件:叶子节点。当遇到叶子节点时,判断是否是最后一层的叶子节点。

代码

/**
 * 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}
 */
 
 // 本题其实前中后序遍历均可,因为不管哪种遍历方式,左一定在右前,这样只要有左节点,并且它深度最大,那该节点必定是最底层最左边的节点
var findBottomLeftValue = function(root) {
    let maxDepth=0; // 记录最大深度
    let resultNode=root; // 记录最大深度从左到右的第一个节点

    let getDepth=(node,depth)=>{
        // 终止条件
        if(node.left==null&&node.right==null){
            //不断更新最大深度和最终节点
            if(depth>maxDepth){
                maxDepth=depth;
                resultNode=node; 
            }
            return;
        }
        // 遍历左边
        if(node.left){
            depth++;
            getDepth(node.left,depth);
            depth--; // 回溯到上一层
        }

        if(node.right){
            depth++;
            getDepth(node.right,depth);
            depth--; // 回溯到上一层
        }
        return
    }
    getDepth(root,1);
    return resultNode.val;
};

image.png

总结

本题的难点:

  1. 要理解题意:题目说的是最左边的节点,而不是左叶子节点
  2. 递归之后要回溯到上一级,因为要从上一级往另外一边遍历。

如有错误之处,欢饮大家留言指教,谢谢大家了。