给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [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;}
};