从递归到迭代吃透树的层次——力扣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。
  • 是最经典、最自然的思路。
java 复制代码
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。
  • 最终层数即为最大深度。
java 复制代码
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 迭代版)

思路:

  • 用栈模拟递归过程,栈中保存节点及其当前深度。
  • 每次出栈时更新最大深度。
java 复制代码
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) 控制过程灵活
相关推荐
Omics Pro12 小时前
新型条件传输模型!虚拟细胞扰动预测
数据库·人工智能·算法·机器学习·自然语言处理
黄金龙PLUS12 小时前
5个800比特大状态置换算法的设计与分析
算法·网络安全·密码学·哈希算法·同态加密
政企项目老覃12 小时前
大模型 Agent 自主任务编排:电商客服地址解析从 12% 失败率到 2.1% 的落地复盘
人工智能·程序人生·算法
kukubuzai13 小时前
双指针系列二--末尾篇(3道题)
c++·算法·leetcode
2401_8322981013 小时前
人工智能:重塑时代发展的核心科技力量
职场和发展
杜 硕13 小时前
单链表经典算法题
数据结构·算法
小O的算法实验室13 小时前
IEEE TCYB,着色旅行商问题:模型、求解与应用
算法
h_a_o777oah13 小时前
【图论】网络流:Dinic 算法模板实现原理及解题技巧
c++·算法·图论·acm·网络流·最小割·dinic算法
June bug13 小时前
【HCIA- AI(正课)】4.1 华为智算方案
职场和发展
我不会起名字32214 小时前
一天一道力扣Hot100(37):深度优先算法--括号生成
java·数据结构·c++·后端·python·算法·go