【刷题笔记】111. 二叉树的最小深度

80 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

一、题目描述:

111. 二叉树的最小深度 - 力扣(LeetCode) (leetcode-cn.com)

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

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

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

示例 1:

image.png

输入: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

二、思路分析:

二叉树的最小深度,本质上就是从根节点 root 到终点叶子节点的最短路径,对于最短路径问题,深度优先搜索(BFS)是常用解决方法。同时,参考官方题解,给出了深度优先搜索的题解。

  • 方法一 深度优先算法
    • 使用队列
    • 注意终止寻找也就是找到叶子节点的判断条件
  • 方法二 广度优先算法
    • 递归

三、AC 代码:

/**
 * 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 minDepth(TreeNode root) {
        if (root == null) return 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        // root 本身是一层,将深度初始化为1
        int depth = 1;
        // 添加节点进行遍历
        while (!queue.isEmpty()) {
            int size = queue.size();
            // 从当前已有节点向后进行查找
            for (int i = 0; i < size; i++) {
                TreeNode cur = queue.poll();
                // 判断是否为叶子节点
                if (cur.left == null && cur.right == null)
                    return depth;
                // 向队列中添加元素
                if (cur.left != null)
                    queue.offer(cur.left);
                if (cur.right != null)
                    queue.offer(cur.right);
            }
            depth++;
        }
        return depth;
    }
}
/**
 * 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 minDepth(TreeNode root) {
        if (root == null) return 0;

        if (root.left == null && root.right == null) return 1;

        int min_depth = Integer.MAX_VALUE;
        
        if (root.left != null) {
            min_depth = Math.min(minDepth(root.left), min_depth);
        }
        if (root.right != null) {
            min_depth = Math.min(minDepth(root.right), min_depth);
        }

        return min_depth + 1;
    }
}

范文参考:

【Nick】超简单的层次遍历思路! - 二叉树的最小深度 - 力扣(LeetCode)