题目链接:
题目描述
思路
1 递归
复杂度分析
- 时间复杂度:O(N)。每个节点访问一次,N是节点数
- 空间复杂度:最坏情况下,整棵树是非平衡的,例如每个节点都只有一个孩子,递归会调用 NN (树的高度)次,因此栈的空间开销是 O(N)。但在最好情况下,树是完全平衡的,高度只有 log(N),因此在这种情况下空间复杂度只有 O(log(N)) 。
// 递归
// 对于树[1,2] 最小深度是2 因为根节点不能作为叶子节点
class Solution {
public:
int minDepth(TreeNode* root) {
if(!root) return 0;
if(!root->left && !root->right) return 1;
int ret = INT_MAX;
if(root->left) // 根节点不能作为叶子节点,需要进行判断
ret = min(ret, minDepth(root->left));
if(root->right)
ret = min(ret, minDepth(root->right));
return ret + 1;
}
2 层序遍历非递归
使用非迭代的层序遍历,不一定要访问到所有节点。一旦某一层出现叶子节点,立刻返回当前深度。
复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)
// 层序遍历 非递归
class Solution {
int ret = 0;
public:
int minDepth(TreeNode* root) {
if(!root) return 0;
queue<TreeNode*> q;
q.push(root);
int nextLayerNodes = 1;
int currLayerNodes = 1;
while(!q.empty()){
currLayerNodes = nextLayerNodes;
nextLayerNodes = 0; // 下一层置零
ret ++; // 深度计数+1
while(currLayerNodes-- > 0){
TreeNode *node = q.front();
q.pop();
if(node->left){
nextLayerNodes ++;
q.push(node->left);
}
if(node->right){
nextLayerNodes ++;
q.push(node->right);
}
if(!node->left && !node->right && ret>1) // 注意要加上判断ret>1 根节点不能作为叶子节点
return ret;
}
}
return ret;
}
};