【leetcode】111 二叉树的最小深度(二叉树)

题目链接:

题目描述

思路

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;
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值