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

从递归到迭代吃透树的层次——力扣104.二叉树的最大深度

力扣104.二叉树的最大深度

在这里插入图片描述


一、题目分析

题目:
给定一棵二叉树的根节点 root,返回它的最大深度。
最大深度定义为:从根节点到最远叶子节点的最长路径上的节点数量。

输入输出示例:

输入输出说明
[3,9,20,null,null,15,7]3最长路径是 3 → 20 → 7
[1,null,2]2最长路径是 1 → 2

数据范围:

  • 节点个数在 [0, 10^4]
  • 节点值在 [-100, 100]

二、解法一:递归(深度优先)

思路:

  • 若树为空,深度为 0。
  • 否则,最大深度等于左右子树深度的最大值 + 1。
  • 是最经典、最自然的思路。
public class Solution {public int maxDepth(TreeNode root) {if (root == null) return 0;int leftDepth = maxDepth(root.left);int rightDepth = maxDepth(root.right);return Math.max(leftDepth, rightDepth) + 1;}
}

在这里插入图片描述

复杂度分析:

  • 时间复杂度:O(n),每个节点遍历一次。
  • 空间复杂度:O(h),h 为树的高度(最坏情况下退化为 O(n))。

三、解法二:层序遍历(BFS)

思路:

  • 用队列逐层遍历,每遍历一层深度 +1。
  • 最终层数即为最大深度。
import java.util.*;public class Solution {public int maxDepth(TreeNode root) {if (root == null) return 0;Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);int depth = 0;while (!queue.isEmpty()) {int size = queue.size();for (int i = 0; i < size; i++) {TreeNode node = queue.poll();if (node.left != null) queue.offer(node.left);if (node.right != null) queue.offer(node.right);}depth++;}return depth;}
}

在这里插入图片描述

复杂度分析:

  • 时间复杂度:O(n),每个节点进出队各一次。
  • 空间复杂度:O(n),队列最多同时容纳一层节点。

四、解法三:显式栈(DFS 迭代版)

思路:

  • 用栈模拟递归过程,栈中保存节点及其当前深度。
  • 每次出栈时更新最大深度。
import java.util.*;public class Solution {public int maxDepth(TreeNode root) {if (root == null) return 0;Stack<TreeNode> nodeStack = new Stack<>();Stack<Integer> depthStack = new Stack<>();nodeStack.push(root);depthStack.push(1);int maxDepth = 0;while (!nodeStack.isEmpty()) {TreeNode node = nodeStack.pop();int depth = depthStack.pop();maxDepth = Math.max(maxDepth, depth);if (node.left != null) {nodeStack.push(node.left);depthStack.push(depth + 1);}if (node.right != null) {nodeStack.push(node.right);depthStack.push(depth + 1);}}return maxDepth;}
}

在这里插入图片描述

复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

五、方法比较

方法思路是否递归是否按层遍历空间复杂度优点
递归自顶向下计算O(h)代码简洁直观
BFS队列层序遍历O(n)层数一目了然
显式栈 DFS手动栈模拟递归O(n)控制过程灵活
http://www.dtcms.com/a/486637.html

相关文章:

  • 基于无监督深度学习方法的非迭代式、不确定性感知的磁共振成像肝脏脂肪定量评估|文献速递-文献分享
  • 如何能把网站做的更大宿主选择 网站建设
  • django rest framework:从零开始搭建RESTful API
  • springboot3加密配置文件的值
  • 抗干扰汽车微型网络(RAMN)开源测试平台的设计
  • wordpress 评测谷歌seo优化什么意思
  • C++手撕无锁线程池
  • kettle Spoon.bat启动报错:could not create the java virtual machine
  • 连云港做网站企业网站建设简单合同
  • DB-GPT AWEL工作流引擎深度解析
  • 提升应用性能:Go中的同步与异步处理
  • OpenAI 最新开源模型 gpt-oss 架构与训练解析
  • 网站片区韶关网站seo
  • 红帽Linux复习-从命令行管理文件、创建查看编辑文本文件
  • C++11(lambda和包装器)
  • 时钟特性约束(四)
  • 免费公司网站如何建立设计品牌网页设计
  • jQuery 尺寸
  • 做木工网站天河建设网站公司排名
  • 嵌入式软件--STM32 SPI通信(上)
  • PHP “真异步“ TrueAsync SAPI 与 NGINX Unit 集成
  • ARCGIS国土超级工具集1.7更新说明
  • 网站如何做信息表美图在线图片编辑器
  • 分布式专题——45 ElasticSearch基础数据管理详解
  • SQLBot:基于大模型与 RAG 的智能问数系统架构
  • 网站系统维护要多久福清市建设工程交易网站好像
  • 在Linux系统上执行 setenv CDS_XVNC_TENBASE + 后重启Virtuoso的作用
  • SpringBoot用户登录注册系统设计与实现
  • 杭州余杭做网站公司秦皇岛 网站建设
  • 并查集-990.等式方程的可满足性-力扣(LeetCode)