当前位置: 首页 > news >正文

【二叉树】LC 104.二叉树的最大深度

文章目录

  • 前言
  • 一、题目
    • 1、原题链接
    • 2、题目描述
  • 二、个人思路整理
    • 1、思路分析
      • DFS递归解法(时间复杂度O(n) 、空间复杂度O(h))
      • BFS层序遍历解法(时间复杂度O(n)、空间复杂度O(w))
    • 2、解题代码
      • 递归解法(时间复杂度O(n) 、空间复杂度O(h))
      • 迭代解法(时间复杂度O(n)、空间复杂度O(w))
  • 三、知识风暴

前言

本专栏文章为《LeetCode 热题 100》的刷题题解,相关内容如有侵权,立即删除。

一、题目

1、原题链接

104.二叉树的最大深度

2、题目描述


二、个人思路整理

1、思路分析

DFS递归解法(时间复杂度O(n) 、空间复杂度O(h))

  1. 递归终止条件:当前节点为空,则直接返回;
  2. 递归体:
    分别递归计算左、右子树的深度,取最大值;当前节点所在子树的深度即为最大值+1。

复杂度分析

  • 时间复杂度:O ( n ) \mathcal{O}(n)O(n),每个节点都会被遍历一次(其中n nn为节点总数)。
  • 空间复杂度:O ( h ) \mathcal{O}(h)O(h),取决于递归调用的栈深度,其中h hh为树的高度(最坏情况下退化为链表时为O ( n ) \mathcal{O}(n)O(n),平衡二叉树时为O ( log ⁡ n ) \mathcal{O}(\log n)O(logn))。

BFS层序遍历解法(时间复杂度O(n)、空间复杂度O(w))

利用队列,依次【循环将每层的节点入队,在处理每层节点时,循环出队元素,在每个节点出队时将其左、右孩子入队(如果有)方便下一轮循环】,同时在处理完每层节点时,记录层层数,直至队列为空,最终答案即为最大深度。

复杂度分析

  • 时间复杂度:O ( n ) \mathcal{O}(n)O(n),遍历所有节点。
  • 空间复杂度:O ( w ) \mathcal{O}(w)O(w),队列中最多保存树中节点较多那一层的节点数(即树的最大宽度w ww)。

2、解题代码

递归解法(时间复杂度O(n) 、空间复杂度O(h))

/** * 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) {} * }; */classSolution{public:intmaxDepth(TreeNode*root){if(root==nullptr){return0;}returnmax(maxDepth(root->left),maxDepth(root->right))+1;}};

迭代解法(时间复杂度O(n)、空间复杂度O(w))

/** * 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) {} * }; */classSolution{public:intmaxDepth(TreeNode*root){if(root==nullptr){return0;}queue<TreeNode*>q;q.push(root);intans=0;while(!q.empty()){intsize=q.size();//记录当前层的节点数,控制下面循环次数,如果不记录这个值,而是直接用q.size()作为循环判断条件,则会导致死循环//处理当前层的size个节点,同时将下一层(即这个size个节点的孩子)放入队列while(size--){TreeNode*tmp=q.front();q.pop();if(tmp->left!=nullptr){q.push(tmp->left);}if(tmp->right!=nullptr){q.push(tmp->right);}}ans++;//每处理完一层,深度+1}returnans;}};

三、知识风暴

  • DFS与BFS

易错点总结

  1. BFS 必须先固定每层节点数:
    进入每层遍历前必须用int size = q.size();固定当前层节点数量;切忌直接把q.size()写在循环条件中,因为入队新节点会改变q.size(),导致把下一层节点混入当前层,引发死循环或深度统计错误。
  2. 深度累加时机:ans++必须在处理完一整层节点后执行,而非每弹出单个节点就累加。
http://www.jsqmd.com/news/1351579/

相关文章:

  • 维修工程师的示波器实战:11 为什么有些问题,一测反而消失了?
  • AirLLM:在4GB显存的GPU上跑70B大模型,不需要量化
  • 泰安本地防水补漏哪家好?屋顶 卫生间 外墙 地下室 阳台堵漏师傅对比(2026年8月新) - 金信达
  • 0372-Raylib-调色板
  • 符合 GB 标准亲肤鞋品 - 中媒介
  • 2026年heic转png工具盘点:哪几款在线转换和免费方法更省心 - 软件小管家
  • 混合模型ANOVA:固定与随机效应的统计分析实践
  • 前端测试实战:从单元测试到E2E的完整指南
  • 广东做智能照明系统哪家不错? - 中媒介
  • 从《索尼克速度模拟器》新角色更新,解析Roblox游戏的长线运营与玩家留存策略
  • 数字绘画流程深度解析:从角色设计到AI辅助创作实践
  • 宁波靠谱的市政管道CCTV检测批发厂家推荐有哪些 - geo交流
  • 几十页英文行业报告怎么快速看?比逐页翻译更高效的方法
  • AI记忆卡项目:本地部署与测试指南,打造个性化智能助手
  • 【办公类110-04】20260806园园通小班分班后“待处理问题”(批量信息、默认省市区、待添加地址)
  • 从 SEGW 到真实 HTTP 响应,彻底搞懂 SAP Gateway Client 如何测试 OData Service
  • 伊宁纯实木定制与整装怎么选?2026年本地家装市场现状与机构分析 - 优质品牌商家
  • 2026年滚筒线设备源头厂家实力解析:重载/动力/积放式/转弯/伸缩/分拣/不锈钢全场景应用 - 卓企推荐
  • 惠州套餐哪家分量足? - 中媒介
  • 2026湖南影视剪辑培训机构综合评测报告:5家机构全能班赛道全维度对比 - 第三方测评
  • 2026杭州诚信的数字化变电站制造商推荐哪家专业?这份场景化甄选指南教你择优避坑 - geo交流
  • 从 SEGW 到 Fiori Elements,彻底理解 SAP OData 的 Model Provider Classes
  • Word域代码全解析:从核心原理到自动化文档实战
  • 喝酒这4种混搭碰都别碰,每种都在给身体埋雷,第二种骗了很多人
  • 泉州洪濑鸡爪 - 中媒介
  • 2026甄选:超高压手动泵实力厂家——福顿(江苏)工业装备有限公司 - 优企名品
  • 2026年国家级绿色工厂申报政策全解读
  • 从 CDS 元数据到 Fiori 页面,Framework-Specific Annotations 到底是谁在读取
  • 2026年经编针织布采购参考:绒类面料与水晶绒供应商甄选指南 - 优质品牌商家
  • 纯净营养面条哪家推荐? - 中媒介