给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
分析:这题一定要搞明白叶子节点,与求最大深度不同,最大深度能够保证最后一个节点绝对是叶子节点,而最小深度不行。
示例:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
1.递归
思路:这里贴出题解区推荐题解
原地址:二叉树的最小深度-理解递归结束条件
int minDepth(TreeNode* root) {
if(!root) return 0;
if(root -> left == NULL && root -> right == NULL) return 1;
int ldepth = minDepth(root -> left);
int rdepth = minDepth(root -> right);
if(root -> left == NULL || root -> right == NULL) return ldepth + rdepth + 1;
return ldepth > rdepth ? rdepth + 1 : ldepth + 1;
}
2.利用队列
思路:这里代码和二叉树最大深度差不多,但是还是要注意叶子节点的要求,必须左孩子结点和右孩子结点都为空。
int minDepth(TreeNode* root) {
if(!root) return 0;
queue<TreeNode*> q;
q.push(root);
TreeNode* p = nullptr;
int size = 0, depth = 1;
while(!q.empty())
{
size = q.size();
for(int i = 0; i < size; i++)
{
p = q.front();
q.pop();
if(p -> left == NULL && p -> right == NULL) return depth; //左结点和右结点都为空,说明是叶子结点,直接返回层数
if(p -> left != NULL) q.push(p -> left);
if(p -> right != NULL) q.push(p -> right);
}
++depth;
}
return depth;
}