day151—双端队列—找树左下角的值(LeetCode-513)

题目描述

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

解决方案:

这段代码的核心功能是找到二叉树最底层最左侧的节点值 ,采用「层序遍历(BFS)+ 优先入队右子节点」的技巧实现,时间复杂度 O(n)n 为节点数),空间复杂度 O(n)(队列存储节点开销),是该问题的简洁高效解法。

核心逻辑

代码利用队列实现层序遍历,但通过调整子节点入队顺序(先右后左),让最后遍历到的节点恰好是 "最底层最左侧" 的节点,无需记录层数:

  1. 初始化
    • 用双端队列 deq 存储待遍历节点,初始加入根节点;
    • ans 记录结果,初始化为根节点值(兜底空树 / 单节点场景);
  2. 层序遍历循环 :只要队列非空,持续遍历:
    • 取出队列头部节点 node,并更新 ans 为该节点的值;
    • 核心技巧:先将右子节点入队,再将左子节点入队(改变常规的 "先左后右" 顺序);
  3. 返回结果 :遍历结束时,ans 最后一次更新的值就是 "最底层最左侧" 节点的值(因为先遍历右节点,最后遍历到的必然是最底层最左节点)。

总结

  1. 核心思路:通过「先右后左」的入队顺序,让层序遍历的最后一个节点就是 "最底层最左侧" 节点,无需统计层数或记录每一层的第一个节点;
  2. 关键细节:队列遍历采用 "取头→更新结果→右子入队→左子入队" 的顺序,保证遍历到最底层时,最后一个节点是最左侧的;
  3. 效率特点:每个节点仅入队 / 出队一次,时间 O(n);队列空间开销取决于树的宽度(最坏为最后一层节点数),是该问题的最优解法之一。

函数源码:

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        deque<TreeNode*> deq={root};
        int ans=root->val;
        while(!deq.empty()){
            TreeNode* node=deq.front();
            deq.pop_front();
            ans=node->val;
            if(node->right){
                deq.push_back(node->right);
            }
            if(node->left){
                deq.push_back(node->left);
            }
        }
        return ans;
    }
};
相关推荐
wabs66612 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
mifengxing12 小时前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
Tongzhi202613 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
Wang's Blog13 小时前
AI Agent白手起家30: 动态示例选择器之根据长度选择 Few Shot 示例
算法
oyguyteggytrrwwwrt15 小时前
自制交叉线路识别算法
算法
手写码匠15 小时前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
晓天衡宇•评测社区16 小时前
FSR-Bench 前沿科学推理榜单发布:GPT-5.5 居首,“会推理”未必“能答对”
算法
程序喵大人17 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法
hanlin0317 小时前
动态规划专练:力扣第121、122题
笔记·算法·leetcode
To_OC17 小时前
LC 74 搜索二维矩阵:换皮的二分查找,我居然一开始没看出来
javascript·算法·leetcode