一、题目描述与要求
题目描述
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例
示例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
二、解题思路
总的思路:
要求出给定二叉树的最小深度的思路其实和前面求最大深度的思路类似,只不过将最大深度改成最小深度。所以首先判断树是否为空树,是则返回0,接着判断树是否只有一个根结点,是则返回1.接下来就是对不空的树采用递归的方法进行遍历。先定义一个较大的数为最小深度的初始值,接着在递归中求出左右子树的最小深度与min进行比较,若小于min则将值赋给min,接着访问右子树。最后记住深度是包括根结点的,因此要返回min+1.
具体步骤:
1、判断二叉树是否为空,是返回0
2、判断二叉树是否只有一个根结点,是则返回1
3、定义总的最小深度min, 对左子树进行遍历判断其最小深度与目前最小深度的大小;对右子树进行遍历判断其最小深度与目前最小深度的大小。
4、返回min+1.
三、具体代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int minDepth(struct TreeNode* root){
if(root==NULL)//二叉树为空树直接返回0
return 0;
if(root->left==NULL&&root->right==NULL)//二叉树只有一个根结点直接返回1
return 1;
int min=INT_MAX;//初始化最小深度为一个最大值
if(root->left!=NULL)//如果左子树不为空则求左子树的最小深度
{//递归调用函数求左子树的最小深度,如果比目前总的最小深度的值还小则将值赋给min
//if(minDepth(root->left)<min)
//min=minDepth(root->left);
min=fmin(minDepth(root->left),min);
}
if(root->right!=NULL)
{
//if(minDepth(root->right)<min)
//min=minDepth(root->right);
min=fmin(minDepth(root->right),min);
}
return min+1;
}