给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回它的最小深度 2.
解法一:利用递归。与求二叉树最大深度类似,只不过只是将最大深度换成了最小深度。
class Solution {
public:
int minDepth(TreeNode* root) {
//递归的方法
//递归的终止条件
if(root == NULL) return 0;
if(root->left == NULL)
return minDepth(root->right) + 1;
if(root->right == NULL)
return minDepth(root->left) + 1;
//当前层的逻辑
int left = minDepth(root->left) + 1;
int right = minDepth(root->right) + 1;
//下探到下一层
return left >= right ? right : left;
//清理当前状态
}
};
class Solution {
public:
int minDepth(TreeNode* root) {
//递归的方法
//递归的终止条件
if(root == NULL) return 0;
//当前层的逻辑
int left = minDepth(root->left);
int right = minDepth(root->right);
if(root->left == NULL || root->right == NULL)
return left == 0 ? right + 1 : left + 1;
//下探到下一层
return min(left, right) + 1;
//清理当前状态
}
};
解法二:采用迭代,注意这里和二叉树的层序遍历,以及求二叉树的层序遍历的迭代法一样,只需要注意,如果有一个节点的左右孩子都没有,则可以立刻返回。
class Solution {
public:
int minDepth(TreeNode* root) {
//采用递归的方法时,一旦递归到有一个节点是叶子节点,即可返回
int deep = 0;
queue<TreeNode*> que;
if(root) que.push(root);
while(!que.empty()) {
deep++;
int length = que.size();
while(length--) {
TreeNode* tmp = que.front();
que.pop();
if(tmp->left == NULL && tmp->right == NULL) return deep;
if(tmp->left) que.push(tmp->left);
if(tmp->right) que.push(tmp->right);
}
}
return deep;
}
};