力扣【二叉树专题】👊 513. 找树左下角的值

119 阅读2分钟

「这是我参与2022首次更文挑战的第 23 天,活动详情查看:2022首次更文挑战

题目链接

513. 找树左下角的值 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

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

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

测试用例

示例 1:

image.png

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

示例 2:

image.png

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

题目分析

题目需要我们求一个二叉树中,最下面一层的左边第一个节点的值

对应这种类型的题目,常规的对树进行递归遍历,无法找到满足要求的节点。最佳的办法是一层层的遍历二叉树。使用一个变量+标记来记录当前层的左侧第一个节点的值。当遍历到下一层时,对变量进行覆盖赋值(由于树的结构的特性,只有在完整的遍历完一层后,才会知道下一层该遍历的节点),当完整的遍历了二叉树后,就能获取并返回题目需要的值

image.png

代码实现

var findBottomLeftValue = function(root) {
    let nodes = [root],
        len = nodes.length;
    let leftVal = root.val;
    while (len > 0) {
        let flag = true;
        for (; len > 0; len--) {
            let curr = nodes.shift();
            if (flag) {
                leftVal = curr.val;
                flag = false;
            }
            if (curr.left != null) nodes.push(curr.left);
            if (curr.right != null) nodes.push(curr.right);
        }
        len = nodes.length;
    }
    return leftVal;
};

image.png

解法 2

以示例2 来演示前序遍历

image.png

我们使用两个变量,val 表示节点的值, deep 表示值在树中的深度。根据二叉树前序遍历的特性,相同深度的节点,第一次遍历到的时候,一定是最左侧的值,我们只需要记录下来最大的深度第一个得到的值即可

代码实现如下:

var findBottomLeftValue = function(root) {
    let deep = 1,
        val = root.val;
    trave(root, 1);
    return val;

    function trave(node, d) {
        if (node == null) return;
        d++;
        if (d > deep) {
            val = node.val;
            deep = d;
        }
        trave(node.left, d);
        trave(node.right, d);
    }
}

image.png


两种解法性能看着差不多,但递归的方式用到了二叉树遍历的特性,存在一定的局限性