力扣每日一题0622-513. 找树左下角的值

124 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

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

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

示例 1:

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

示例 2:

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

深度优先搜索

使用 height\textit{height} 记录遍历到的节点的高度,curVal\textit{curVal} 记录高度在 curHeight\textit{curHeight} 的最左节点的值。在深度优先搜索时,我们先搜索当前节点的左子节点,再搜索当前节点的右子节点,然后判断当前节点的高度 height\textit{height} 是否大于 curHeight\textit{curHeight},如果是,那么将 curVal\textit{curVal} 设置为当前结点的值,curHeight\textit{curHeight} 设置为 height\textit{height}

因为我们先遍历左子树,然后再遍历右子树,所以对同一高度的所有节点,最左节点肯定是最先被遍历到的。

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;
    dfs(root, 0);
    return curVal;
};

复杂度分析

-时间复杂度:O(n),其中 n 是二叉树的节点数目。需要遍历 n 个节点。

-空间复杂度:O(n)。递归栈需要占用 O(n) 的空间。

作者:LeetCode-Solution 链接:leetcode.cn/problems/fi… 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

广度优先搜索

使用广度优先搜索遍历每一层的节点。在遍历一个节点时,需要先把它的非空右子节点放入队列,然后再把它的非空左子节点放入队列,这样才能保证从右到左遍历每一层的节点。广度优先搜索所遍历的最后一个节点的值就是最底层最左边节点的值。

var findBottomLeftValue = function(root) {
    let ret = 0;
    const queue = [root];
    while (queue.length) {
        const p = queue.shift();
        if (p.right) {
            queue.push(p.right);
        }
        if (p.left) {
            queue.push(p.left);
        }
        ret = p.val;
    }
    return ret;
};