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;
    }
}
相关推荐
AI科技星35 分钟前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
SamDeepThinking41 分钟前
并发量就算只有2,该上锁还得上呀
java·后端·架构
Sam_Deep_Thinking1 小时前
如何让订单系统和营销系统解耦
java·架构·系统架构
lzhdim1 小时前
SQL 入门 12:SQL 视图:创建、修改与可更新视图
java·大数据·服务器·数据库·sql
科研前沿1 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨1 小时前
1931. 用三种不同颜色为网格涂色
算法·leetcode
晨曦夜月2 小时前
map与unordered_map区别
算法·哈希算法
FQNmxDG4S2 小时前
Maven依赖管理:版本冲突解决与生命周期控制
java·数据库·maven
qeen872 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码2 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻