111.二叉树的最小深度(二叉树算法题)

111.二叉树的最小深度

力扣题目链接(opens new window)

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

**说明:**叶子节点是指没有子节点的节点。

示例 1:

复制代码
输入:root = [3,9,20,null,null,15,7]
输出:2

示例 2:

复制代码
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

提示:

  • 树中节点数的范围在 [0, 105]
  • -1000 <= Node.val <= 1000

#思路

相对于 104.二叉树的最大深度 ,本题还也可以使用层序遍历的方式来解决,思路是一样的。

需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点。

java 复制代码
/**
 * Definition for a binary tree node.
 * 
 * public class TreeNode {
 *     int val;              // 节点的整数值
 *     TreeNode left;        // 指向左子节点的引用(指针),若无左子节点则为 null
 *     TreeNode right;       // 指向右子节点的引用(指针),若无右子节点则为 null
 *     
 *     // 默认构造函数:创建一个空节点(val 默认为 0)
 *     TreeNode() {}
 *     
 *     // 构造函数:根据给定的值创建一个节点,左右子节点默认为 null
 *     TreeNode(int val) { 
 *         this.val = val; 
 *     }
 *     
 *     // 构造函数:根据给定的值和左右子节点创建一个完整节点
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */

class Solution {
    /**
     * 计算二叉树的最小深度。
     * 
     * 二叉树的最小深度是从根节点到最近的叶子节点的最短路径上的节点数。
     * 叶子节点是指没有子节点的节点(即 left == null 且 right == null)。
     * 
     * 算法使用层序遍历(广度优先搜索,BFS):
     * - 从根节点开始,逐层向下遍历。
     * - 一旦遇到第一个叶子节点,当前所在的层数就是最小深度。
     * - 因为 BFS 是按层进行的,所以第一个遇到的叶子节点一定是最浅的。
     * 
     * 示例 1:
     * 输入:[3,9,20,null,null,15,7]
     *       3
     *      / \
     *     9  20
     *       /  \
     *      15   7
     * 输出:2
     * 解释:从根节点 3 到叶子节点 9 的路径长度为 2,是最小深度。
     * 
     * 示例 2:
     * 输入:[2,null,3,null,4,null,5,null,6]
     *   2
     *    \
     *     3
     *      \
     *       4
     *        \
     *         5
     *          \
     *           6
     * 输出:5
     * 解释:这是一条单边树,最小深度就是整条路径的长度。
     * 
     * @param root 二叉树的根节点
     * @return 返回二叉树的最小深度(整数)
     */
    public int minDepth(TreeNode root) {
        // 创建一个队列用于实现广度优先搜索(BFS)
        // 队列中存储待处理的树节点
        Queue<TreeNode> queue = new LinkedList<>();
        
        // 如果根节点为空,说明树为空,最小深度为 0
        if (root == null) return 0;
        
        // 将根节点加入队列,作为遍历的起点
        queue.offer(root);

        // 记录当前遍历的深度(层数),初始为 0
        int depth = 0;

        // 当队列不为空时,说明还有节点未处理(即还有层未遍历完)
        while (!queue.isEmpty()) {
            // 记录当前层的节点数量
            // 这个值决定了内层循环需要处理多少个节点
            int len = queue.size();
            
            // 每进入一层,深度加一
            depth++;

            // 遍历当前层的所有节点(共 len 个)
            for (int i = 0; i < len; i++) {
                // 从队列头部取出一个节点进行处理
                TreeNode temp = queue.poll();
                
                // 关键判断:如果当前节点是叶子节点(没有左右子节点)
                // 说明我们找到了从根到叶子的最短路径,直接返回当前深度
                if (temp.left == null && temp.right == null) {
                    return depth;
                }
                
                // 如果当前节点有左子节点,则将其加入队列,供下一层处理
                if (temp.left != null) {
                    queue.offer(temp.left);
                }
                
                // 如果当前节点有右子节点,则将其加入队列,供下一层处理
                if (temp.right != null) {
                    queue.offer(temp.right);
                }
            }
            // 当前层的所有节点处理完毕
            // 队列中现在存储的是下一层的所有节点(如果有)
        }

        // 理论上不会执行到这里,因为只要有节点,最终一定会遇到叶子节点
        // 但为了语法完整,返回 depth(处理极端情况)
        return depth;
    }
}
相关推荐
蒙奇D索大3 分钟前
【数据结构】考研408 | 平方探测法精讲:跳跃探查的艺术与聚集迷思
数据结构·笔记·考研·改行学it
xwz小王子4 分钟前
UniBYD:超越人类示教模仿的跨实体机器人操作学习统一框架
学习·算法·机器人·跨实体
Violet_YSWY6 分钟前
哪些常量用枚举,哪些用类
java
shoubepatien7 分钟前
JAVA -- 09
java·开发语言
kong79069288 分钟前
Java新特性-(三)程序流程控制
java·java新特性
愿你天黑有灯下雨有伞9 分钟前
Spring Boot 使用FastExcel实现多级表头动态数据填充导出
java·faseexcel
阿拉斯攀登9 分钟前
自定义 Spring Boot 自动配置
java·spring boot
CodeAmaz15 分钟前
Spring编程式事务详解
java·数据库·spring
没有bug.的程序员17 分钟前
微服务基础设施清单:必须、应该、可以、无需的四级分类指南
java·jvm·微服务·云原生·容器·架构
武子康19 分钟前
Java-204 RabbitMQ Connection/Channel 工作流程:AMQP 发布消费、抓包帧结构与常见坑
java·分布式·消息队列·rabbitmq·ruby·java-activemq