111. 二叉树的最小深度

85 阅读2分钟

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

左右子树深度最小的子树 最小子树深度+1二叉树整树的最小深度

示例1二叉树左子树最小深度子树,leftdep=1,midep=left+1=2. 二叉树最小深度为2

image.png

ps

有一种特殊情况 如图 (8-1)二叉树只有一棵子树的情况【0,-10】)

image.png 假如按照return 1 + min(minDepth(root->left), minDepth(root->right));的方式

那么会返回右子树深度+1,即 (0)+ 1=1

但是看(8-1)的图我们可以看出来二叉树最小深度应该为2 。

解决方案

如果一棵子树为NULL,那空的子树就不纳入求解范围。

例如:

只有左子树,右子树为NULL。那么左子树就为最小子树深度,右子树不算入。左子树深度+1=2,即二叉树最小深度

同理,只有右子树,左子树为NULL。那么整棵树的最小深度即为 右子树深度+1.

所以我们有很多种情况考虑,具体如下:

class Solution {
public:
    int minDepth(TreeNode* root) {
    
    //如果根节点为空,就返回深度为0
    if(root==nullptr)return 0;
    
    //只有右子树,就返回右子树深度+1
    if(root->left==nullptr&&root->right)
    return minDepth(root->right)+1;
    
    //只有左子树,就返回左子树深度+1
    if(root->left&&root->right==nullptr)
    return minDepth(root->left)+1;
    
    //如果不是叶子节点,返回左右子树路径短的那个加1
    if(root->left&&root->right)
    return 1 + min(minDepth(root->left), minDepth(root->right));
    
    //如果是叶子节点,就返回1,即只有根。
    if(root->left==nullptr&&root->right==nullptr)return 1;


//return 1是因为题目要求必须返回一个值,所以return一下,实际上用不到,因为所有情况上面都写完了。就算写return 0也可以过。
return 1;
    }
};

优化

image.png 即不去计算为空的子树,计算最大的子树深度+1即为二叉树最小深度,同时,如果是叶子节点,左右肯定为NULL,1+NULL还为1,也符合。

总结:

image.png