题目描述
Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.
首先我们注意到,二叉树的深度从根结点往下数到叶子结点等于从叶子结点数到根结点,所以我们可以从下往上来数数的深度。
我们可以使用递归的方法,遍历每个结点。每个结点的最小深度=该结点的左右子树的最小深度 + 1。通过依此比较左右子树的深度,取最小值,最后便能计算出整个二叉树的最小深度了。
但是由于题目中给定的是一个普通的binary tree而不是full binary tree(每个结点只要有子结点就一定是两个),就可能出现类似以下情况:
也就是说,会出现有的结点只有右子树而没有左子树(如上图),亦或是只有左子树没有右子树。如上图,在计算结点c的最小深度时,它的左子树的深度为0(空结点深度为0),而右子树深度为1,根据之前的算法我们将会得到结点c的最小深度为1。但是题目指出的最小深度为根结点到叶子结点的最短路径所经过的结点数,显然结点c并不是叶子结点,不符合题目要求。
所以我们需要处理这种情况。对于每个结点,我们可以判断其左右子树是否为空。若左右子树均为空,可知我们这个结点为叶子结点,返回1;若左子树为空而右子树不为空,我们应该返回的是右子树的深度+1;若左子树不为空而右子树为空,则返回左子树的深度+1。当左右子树均不为空时,返回左右子树深度的最小值+1。
class Solution {
public:
int run(TreeNode *root) {
if (root == NULL)
return 0;
if (root->left == NULL && root->right == NULL)
return 1;
if(root->left == NULL && root->right != NULL)
return run(root->right) + 1;
if(root->left != NULL && root->right == NULL)
return run(root->left) + 1;
int leftDepth = run(root->left) +1;
int rightDepth = run(root->right) + 1;
return min(leftDepth, rightDepth);
}
};