开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
题目描述
给定一个二叉树,找出它的最小深度
节点定义
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
思路分析
二叉树最小深度和最大深度不同,最大深度中:只需要遍历到最后一层,最后一层的层数就是最大深度。而最小深度要考虑到多种情况,例如:
- 根节点为空
- 根节点不空并且只有一个子树,此时最小深度就是唯一子树的深度
- 根节点不空并且有两个子树,此时最小深度就是两棵子树深度的最小值
代码实现
class Solution {
public:
int minDepth(TreeNode* root) {
//每次遍历都要考虑到三种情况
//当根节点为空时
if(root == nullptr) return 0;
//当根节点不空时依次遍历左右子树
int left = minDepth(root->left);
int right = minDepth(root->right);
//当根节点不空并且只有一个子树(左子树或者右子树)
if(left==0||right==0)
//right+left代表根节点的其中一个子树高度(因为此时有一个子树为空),+1代表加上根节点所占的那一层
return left+right+1;
//当根节点不空并且有两个子树时,取左子树深度和右子树深度的最小值
else return min(right,left)+1;
}
};
难点总结
- 首先要考虑思路分析中的三种情况
- 要先对左右子树遍历到底部
- 再对左右子树的深度进行判断
- 当有一个子树为空时,左右子树深度记为left+right+1,是为了将左子树为空或者右子树为空的两种情况写到一起,因为此时left和right总有一个取值为0
- 知识总结: a?b:c 含义是:a条件是否成立?如果条件成立执行 b 语句,如果条件不成立执行 c 语句