题目描述
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入: root = [3,9,20,null,null,15,7]
输出: 2
分析
有了上一题最大高度的铺垫,我们可以如法炮制,采用后序遍历来获取最小深度,不过最小深度的获取并不能直接取左右子树中的最小值,因为当一棵树的所有左子树或所有右子树不存在时,返回值始终是0,因此在返回深度时,我们应该做进一步的判断。
- 首先判断递归函数的返回值以及参数,自然是整型以及根节点类型的参数。
- 明确结束递归条件,和最大高度一样,当传入节点为空时,返回此时的深度0;
- 单层递归,采用后序遍历,于是先获得左右子树的深度,并按条件返回当前子树的深度,这里有三种情况:
- 左子树为空右子树不为空:此时我们传入的值应该是右子树的深度加上当前节点所占的深度1;
- 右子树为空左子树不为空:此时我们传入的值应该是左子树的深度加上当前节点所占的深度1;
- 左右子树均不为空或均为空:此时我们传入的值应该是二者中更小的深度加上1;
代码实现
int getDep(struct TreeNode* p){
if(p == NULL) return 0;
int leftDep = getDep(p->left);
int rightDep = getDep(p->right);
if(leftDepth == 0 && rightDepth != 0){
return rightDepth + 1;
}else if(rightDepth == 0 && leftDepth != 0){
return leftDepth + 1;
}else{
return fmin(leftDepth,rightDepth) + 1;
}
}
int minDep(struct TreeNode* root){
return getDep(root);
}