# LeetCode 111 、二叉树的最小深度
# 一、题目描述
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
**说明:**叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
示例 2:
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5
提示:
- 树中节点数的范围在 
[0, 10^5]内 -1000 <= Node.val <= 1000
# 二、题目解析
# 三、参考代码
# 1、Java 代码
// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
// 作者:程序员吴师兄
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
//  二叉树的最小深度( LeetCode 111 ):https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/
class Solution {
    public int minDepth(TreeNode root) {
        // 边界情况处理
        if (root == null) return 0;
        // 设置一个队列,用来存储二叉树中的元素
        Queue<TreeNode> nodeQueue = new LinkedList<>();
        // 队列添加二叉树的根节点
        nodeQueue.add(root);
        // 设置 depth 用来保存输出结果
        int depth = 0;
        // 遍历队列,直到队列为空,说明访问了二叉树中所有的节点
        while (!nodeQueue.isEmpty()) {
            // 用来记录 queue 的长度,即每层节点的个数
            int size = nodeQueue.size();
            // 每到一层,深度就 +1
            depth++;
            // 使用 for 循环,将 nodeQueue 中的元素统计
            for (int i = 0; i < size; i++) {
                // 从 queue 中取出一个节点,此时,nodeQueue 已经抛出了这个节点      
                TreeNode curNode = nodeQueue.poll();
                // curNode.left == null && curNode.right == null 
                // 说明是叶子结点
                // 由于【最小深度是从根节点到最近叶子节点的最短路径上的节点数量】
                // 直接返回 depth 
                if(curNode.left == null && curNode.right == null){
                    return depth;
                }
                // 判断当前节点的左子节点是否有值,如果有,则添加到 nodeQueue 中
                if (curNode.left != null){
                    nodeQueue.add(curNode.left);
                } 
                // 判断当前节点的右子节点是否有值,如果有,则添加到 nodeQueue 中    
                if (curNode.right != null){
                    nodeQueue.add(curNode.right);
                }
            }
        }
        // 返回 depth
        return depth;
    }
}
# **2、**C++ 代码
// 登录 AlgoMooc 官网获取更多算法图解
// https://www->algomooc->com
// 作者:程序员吴师兄
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
//  二叉树的最小深度( LeetCode 111 ):https://leetcode-cn->com/problems/minimum-depth-of-binary-tree/
class Solution {
public:
    int minDepth(TreeNode* root) {
        // 边界情况处理
        if(root == NULL) return 0;
        // 设置一个队列,用来存储二叉树中的元素
        queue<TreeNode *> nodeQueue ;
        // 队列添加二叉树的根节点
        nodeQueue.push(root);
        // 设置 depth 用来保存输出结果
        int depth = 0;
        // 遍历队列,直到队列为空,说明访问了二叉树中所有的节点
        while (!nodeQueue.empty()) {
            // 用来记录 queue 的长度,即每层节点的个数
            int size =  nodeQueue.size();
            // 每到一层,深度就 +1
            depth++;
            // 使用 for 循环,将 nodeQueue 中的元素统计
            for (int i = 0 ; i < size ; i++) {
                // 从 queue 中取出一个节点,此时,nodeQueue 已经抛出了这个节点      
                TreeNode *curNode = nodeQueue.front();
                nodeQueue.pop();
                // curNode->left == NULL && curNode->right == NULL 
                // 说明是叶子结点
                // 由于【最小深度是从根节点到最近叶子节点的最短路径上的节点数量】
                // 直接返回 depth 
                if(curNode->left == NULL && curNode->right == NULL){
                   return depth;
                }
                // 判断当前节点的左子节点是否有值,如果有,则添加到 nodeQueue 中
                if (curNode->left != NULL){
                   nodeQueue.push(curNode->left);
                } 
                // 判断当前节点的右子节点是否有值,如果有,则添加到 nodeQueue 中    
                if (curNode->right != NULL){
                   nodeQueue.push(curNode->right);
                }
            }
        }
        // 返回 depth
        return depth;
    }
};
# 3、Python 代码
# 登录 AlgoMooc 官网获取更多算法图解
# https://www.algomooc.com
# 作者:程序员吴师兄
# 代码有看不懂的地方一定要私聊咨询吴师兄呀
#  二叉树的最小深度( LeetCode 111 ):https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/
class Solution:
    def minDepth(self, root: TreeNode) -> int:
        # 边界情况处理
        if root == None :
          return 0
        # 设置一个队列,用来存储二叉树中的元素
        nodeQueue = deque()
        # 队列添加二叉树的根节点
        nodeQueue.append(root)
        
        # 设置 depth 用来保存输出结果
        depth = 0
        # 遍历队列,直到队列为空,说明访问了二叉树中所有的节点
        while nodeQueue : 
            # 用来记录 queue 的长度,即每层节点的个数
            size =  len(nodeQueue)
            # 每到一层,深度就 +1
            depth += 1
            # 使用 for 循环,将 nodeQueue 中的元素统计
            for i in range(size):
                # 从 queue 中取出一个节点,此时,nodeQueue 已经抛出了这个节点      
                curNode = nodeQueue.popleft()
                # curNode.left == None && curNode.right == None 
                # 说明是叶子结点
                # 由于【最小深度是从根节点到最近叶子节点的最短路径上的节点数量】
                # 直接返回 depth 
                if curNode.left == None and curNode.right == None :
                   return depth
                
                # 判断当前节点的左子节点是否有值,如果有,则添加到 nodeQueue 中
                if curNode.left : 
                   nodeQueue.append(curNode.left)
                
                # 判断当前节点的右子节点是否有值,如果有,则添加到 nodeQueue 中    
                if curNode.right :
                   nodeQueue.append(curNode.right)
        # 返回 depth
        return depth