算法day41 二叉树的最小深度

题目描述

解法1:递归
要求出二叉树的最小深度通过递归方法实际上与求最大深度的方式大差不差,但是在求最小深度时要注意一种情况,即二叉树是单侧树时的的最小深度,根据题干的定义,二叉树的最小深度是根节点至距离其路径最短的叶子节点的距离,但是单侧树的另一侧不存在叶子节点,所以若只是简单的将递归求解最大深度的代码的max函数改为min函数实际上是有欠缺的。所以我们应该在返回时判断是否是单侧树。具体的代码如下。

int minDepth(TreeNode* root) {
    if(root == nullptr) return 0;
    int left = minDepth(root->left);
    int right = minDepth(root->right);
    
    //寻找最小深度的时候,是要找根节点与叶节点最小的距离,如果存在左子树或右子树根本不存在的
    //情况而将不存在的情况+1,视为最小深度返回,这是错误的,所以要对这种情况做出应对
    if(root->left && root->right == nullptr){
        return 1+left;
    }
    if(root->left==nullptr && root->right){
        return 1+right;
    }
        return min(left,right)+1;
}

时间复杂度:O(n)
空间复杂度:O(h)

解法2:层序遍历
层序遍历的解法整体与求最大深度时相差不大,我们设置一个终止标志位为0,进入对每层节点的循环时进行判断,若某个节点的左右孩子均不存在,则立刻将终止标志位置位1,随后跳出内层循环,再根据终止标志位判断跳出外层循环,最后返回最小深度。具体的代码如下。

int minDepth(TreeNode* root) {
   int min_depth = 0;
   //终止标志位
   int end_flag = 0;
   queue<TreeNode*> que;
   if(root){
        que.push(root);
   }
   while(!que.empty()){
        int size = que.size();
        while(size--){
            TreeNode *node = que.front();
            que.pop();
            if(node->left){
            que.push(node->left);
            }
            if(node->right){
            que.push(node->right);
            }
            //判断当前的最小深度是否为0,如果为0还满足了当前节点为叶节点,说明这棵二叉树是单侧树,无需理会
            if(node->left == nullptr && node->right == nullptr && min_depth != 0){
                end_flag = 1;
                break;
            }
        }
        min_depth++;
        if(end_flag == 1){
            break;
        }
   } 
   return min_depth;
}

时间复杂度:O(n)
空间复杂度:O(n)

END

posted on 2025-06-16 19:46  sakura430  阅读(12)  评论(0)    收藏  举报