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

题目描述

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

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

题目示例

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

输出: 1

解题思路

深度优先搜索

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

由于我们总是先遍历左节点,再遍历右节点,所以我们可以保证我们每一次更新的最大深度时总是在当前层中的最左侧,记录的是最大深度最左侧节点的值。

广度优先搜索

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

参考代码

深度优先搜索

java 复制代码
class Solution {
    public int maxDepth = Integer.MIN_VALUE;
    public int result;
    public int findBottomLeftValue(TreeNode root) {
        traversal(root, 0);
        return result;
    }
    public void traversal(TreeNode node, int depth) {
        // 如果是叶子结点
        if(node.left == null && node.right == null) {
            // 因为每一层是先看左再看右,所以第一个是最左边的
            // 判断是不是第一个遇到的叶子结点,代表是最左边的
            if(depth > maxDepth) {
                maxDepth = depth;
                result = node.val;
                return;
            }
        }
        if(node.left != null) {
            traversal(node.left, depth + 1);
        }
        if(node.right != null) {
            traversal(node.right, depth + 1);
        }
    }
}

广度优先搜索

java 复制代码
class Solution {
    public int findBottomLeftValue(TreeNode root) {
        int ret = 0;
        Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            TreeNode p = queue.poll();
            if (p.right != null) {
                queue.offer(p.right);
            }
            if (p.left != null) {
                queue.offer(p.left);
            }
            ret = p.val;
        }
        return ret;
    }
}
相关推荐
Hello.Reader10 分钟前
TopK算法在大数据重复数据分析中的应用与挑战
大数据·算法·数据分析
coduck_S12004zbj13 分钟前
csp-j模拟五补题报告
c++·算法·图论
洛临_19 分钟前
【C语言】基础篇
c语言·算法
_.Switch39 分钟前
Python机器学习模型的部署与维护:版本管理、监控与更新策略
开发语言·人工智能·python·算法·机器学习
自由的dream2 小时前
0-1背包问题
算法
2401_857297912 小时前
招联金融2025校招内推
java·前端·算法·金融·求职招聘
爱上语文2 小时前
Java LeetCode每日一题
java·开发语言·leetcode
良月澪二3 小时前
CSP-S 2021 T1廊桥分配
算法·图论
wangyue44 小时前
c# 线性回归和多项式拟合
算法
&梧桐树夏4 小时前
【算法系列-链表】删除链表的倒数第N个结点
数据结构·算法·链表