1:问题描述:给定一个二叉树,找出其最小深度。二叉树的最小深度为根节点到最近叶子节点的距离。
样例
给出一棵如下的二叉树:
1
/ \
2 3
/ \
4 5
这个二叉树的最小深度为 2
2;解题思路:和求最大深度类似,用递归算法,但是比求最大深度复杂,还要考虑斜树的情况。
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: The root of binary tree.
* @return: An integer
*/
int minDepth(TreeNode *root) {
// write your code here
if(root == NULL) return 0;
if(root->left == NULL) return minDepth(root->right) + 1;//斜左子树
if(root->right == NULL) return minDepth(root->left) + 1;//斜右子树
int leftDepth = minDepth(root->left);
int rightDepth = minDepth(root->right);
return leftDepth < rightDepth ? (leftDepth + 1) : (rightDepth + 1);
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: The root of binary tree.
* @return: An integer
*/
int minDepth(TreeNode *root) {
// write your code here
if(root == NULL) return 0;
if(root->left == NULL) return minDepth(root->right) + 1;//斜左子树
if(root->right == NULL) return minDepth(root->left) + 1;//斜右子树
int leftDepth = minDepth(root->left);
int rightDepth = minDepth(root->right);
return leftDepth < rightDepth ? (leftDepth + 1) : (rightDepth + 1);
}
};
4:解题感想:
刚开始拿到这道题,因为先做的是求二叉树的最大深度,求最小深度不就是最大深度的代码改为最小就行了吗? 这样做的结果就是有些测试时通不过的。自己想了想终于知道错哪里了。因为如果出现斜树的时候,只有左子树,或只有右子树的时候,如果按照最大深度的那个算法来实现的话,得出的答案是1,明显是错误的。判断左子树或右子树是否为空,若左子树为空,则返回右子树的深度,反之返回左子树的深度,如果都不为空,则返回左子树和右子树深度的最小值+1.