左右子树 中 深度最小的子树 最小子树深度+1 即 二叉树整树的最小深度
如示例1,二叉树左子树为最小深度子树,leftdep=1,midep=left+1=2. 二叉树最小深度为2
ps
有一种特殊情况
如图 (8-1)二叉树只有一棵子树的情况【0,-10】):
假如按照
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;
}
};
优化
即不去计算为空的子树,计算最大的子树深度+1即为二叉树最小深度,同时,如果是叶子节点,左右肯定为NULL,1+NULL还为1,也符合。
总结: