力扣 二叉树的最大深度

树的遍历,dfs与bfs基础。

题目

注意这种题要看根节点的深度是0还是1。

深度优先遍历dfs,通过递归分别计算左子树和右子树的深度,然后返回左右子树深度的最大值再加上 1。递归会一直向下遍历树,直到达到叶子节点或空节点。在回溯过程中,计算每一层的深度并返回,最终求得整棵树的最大深度。

时间复杂度:O(n),空间复杂度:O(n)(最坏情况)或 O(log n)(最佳情况)。

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) return 0;
        return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
    }
}

广度优先遍历bfs,逐层遍历,从树的第一层开始,逐渐访问下一层。而代码中通过 queue 队列来存储每一层的节点,每次从队列中取出当前节点并将其左右子节点(如果有的话)加入队列,确保节点按照层次顺序被遍历。下一层的节点会在当前层的节点都处理完之后,才开始被访问。

时间复杂度是 O(n),空间复杂度是O(n)。

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public static int maxDepth(TreeNode root) {
        if (root == null) return 0;  // 如果树为空,深度为0
        
        Queue<TreeNode> queue = new LinkedList<>();  // 使用队列
        queue.add(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.add(node.left);  // 如果左子树存在,加入队列
                if (node.right != null) queue.add(node.right);  // 如果右子树存在,加入队列
            }
            depth++;  // 当前层处理完后,深度加1
        }
        
        return depth;  // 返回最大深度
    }
}
相关推荐
尾善爱看海几秒前
前端算法与手写题集
前端·算法
彧azz3 分钟前
Java学习语法篇:变量
java·学习
程序员阿鹏31 分钟前
为什么MySQL InnoDB选择B+树?
数据结构·数据库·b树·sql·mysql·算法·缓存
AI 思录1 小时前
Prompt 事故档案(八):日常表达被标为“待校准”,AI 的爹味语法从哪里来
大数据·人工智能·算法·prompt·用户体验·ai合规
月光船幽幽1 小时前
跨范式映射的稳定接口设计
人工智能·python·算法
信誓旦旦的程序猿1 小时前
【量化系统从零构建 #04】存储设计:选型·建库·交易日历
java·人工智能·python·股票数据api·股票数据·股票数据api接口·股票api数据接口
yurenpai(27届找实习中)1 小时前
Java 10 的 var 为什么不能随便用?从订单汇总看懂类型推断与泛型陷阱
java·开发语言·java18
Flynt2 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
2601_965742222 小时前
全媒体运营与短视频代运营,两者有什么区别?
大数据·数据结构·人工智能·算法·ai·媒体