数据结构与算法之深入解析“二叉树的最小深度”的求解思路与算法示例

Posted Serendipity·y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法之深入解析“二叉树的最小深度”的求解思路与算法示例相关的知识,希望对你有一定的参考价值。

一、题目要求

  • 给定一个二叉树,找出其最小深度。
  • 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
  • 说明:叶子节点是指没有子节点的节点。
  • 示例 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。

二、求解算法

① 深度优先搜索

  • 首先可以想到使用深度优先搜索的方法,遍历整棵树,记录最小深度。
  • 对于每一个非叶子节点,只需要分别计算其左右子树的最小叶子节点深度,这样就将一个大问题转化为了小问题,可以递归地解决该问题。
  • C++ 示例:
class Solution 
public:
    int minDepth(TreeNode *root) 
        if (root == nullptr) 
            return 0;
        

        if (root->left == nullptr && root->right == nullptr) 
            return 1;
        

        int min_depth = INT_MAX;
        if (root->left != nullptr) 
            min_depth = min(minDepth(root->left), min_depth);
        
        if (root->right != nullptr) 
            min_depth = min(minDepth(root->right), min_depth);
        

        return min_depth + 1;
    
;
  • Java 示例:
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;
    

② 广度优先搜索

  • 同样,可以想到使用广度优先搜索的方法,遍历整棵树。
  • 当找到一个叶子节点时,直接返回这个叶子节点的深度。
  • 广度优先搜索的性质保证了最先搜索到的叶子节点的深度一定最小。
  • C++ 示例:
class Solution 
public:
    int minDepth(TreeNode *root) 
        if (root == nullptr) 
            return 0;
        

        queue<pair<TreeNode *, int> > que;
        que.emplace(root, 1);
        while (!que.empty()) 
            TreeNode *node = que.front().first;
            int depth = que.front().second;
            que.pop();
            if (node->left == nullptr && node->right == nullptr) 
                return depth;
            
            if (node->left != nullptr) 
                que.emplace(node->left, depth + 1);
            
            if (node->right != nullptr) 
                que.emplace(node->right, depth + 1);
            
        

        return 0;
    
;
  • Java 示例:
class Solution 
    class QueueNode 
        TreeNode node;
        int depth;

        public QueueNode(TreeNode node, int depth) 
            this.node = node;
            this.depth = depth;
        
    

    public int minDepth(TreeNode root) 
        if (root == null) 
            return 0;
        

        Queue<QueueNode> queue = new LinkedList<QueueNode>();
        queue.offer(new QueueNode(root, 1));
        while (!queue.isEmpty()) 
            QueueNode nodeDepth = queue.poll();
            TreeNode node = nodeDepth.node;
            int depth = nodeDepth.depth;
            if (node.left == null && node.right == null) 
                return depth;
            
            if (node.left != null) 
                queue.offer(new QueueNode(node.left, depth + 1));
            
            if (node.right != null) 
                queue.offer(new QueueNode(node.right, depth + 1));
            
        
        return 0;
    

以上是关于数据结构与算法之深入解析“二叉树的最小深度”的求解思路与算法示例的主要内容,如果未能解决你的问题,请参考以下文章

Java 求解二叉树的最小深度

代码随想录算法训练营第16天 | ● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数

⭐算法入门⭐《二叉树》简单05 —— LeetCode 111. 二叉树的最小深度

《LeetCode之每日一题》:237.二叉树的最小深度

十七:二叉树的最小深度

Leetcode二叉树的最小深度