【递归】10. leetcode 111 二叉树的最小深度

题目描述

题目链接:二叉树的最小深度
在这里插入图片描述

2 解答思路

递归分为三步,接下来就按照这三步来思考问题

第一步:挖掘出相同的子问题  (关系到具体函数头的设计)
第二步:只关心具体子问题做了什么  (关系到具体函数体怎么写,是一个宏观的过程)
第三步:找到递归的出口,防止死递归  (关系到如何跳出递归)

2.1 相同的子问题(函数头设计)

相同的子问题:找二叉树到叶子节点的最短距离,就是找左子树到叶子节点的最短距离和右子树到叶子节点的最短距离的最小值。

下面是leetcode给的函数头:

    int minDepth(TreeNode* root) {
    }

传入一个二叉树,返回二叉树到叶子节点的最短距离。

根据“相同的子问题”,我们不仅需要传入一个二叉树,而且需要传递二叉树的深度,因此需要两个参数。设计的函数头如下:

void dfs(TreeNode* root, int cnt)
{
}

2.2 具体的子问题做了什么(函数体的实现)

具体的子问题:

1.记录当前节点的深度。
2.如果当前节点不是叶子节点就继续计算左子树和右子树的深度。
3.如果当前节点是叶子节点就判断当前深度和最小深度谁小,更新最小深度,然后直接返回(这也是一个递归的出口)

递归的出口:

1.当前节点为空:返回。
2.当前节点为叶子节点:更新值,返回。

函数的实现:

    void dfs(TreeNode* root, int cnt)
    {
        if (root == nullptr)
            return;
        
        cnt++;
        //当节点为叶子节点的时候更新答案
        if ((root->left == nullptr) && (root->right == nullptr))
        {
            ans = min(ans, cnt);
            return;
        }

        //如果不是叶子 -- cnt是局部变量,递归调用的时候会自动退回到当时的值
        dfs(root->left, cnt);
        dfs(root->right, cnt);
    }

总结

class Solution {
public:
//设置为全局变量就不用传递到函数里面去了
    int ans = INT_MAX;

    int minDepth(TreeNode* root) {
        //最开始的深度是0
        dfs(root, 0);
        return root ? ans : 0;
    }

    void dfs(TreeNode* root, int cnt)
    {
        if (root == nullptr)
            return;
        
        cnt++;
        //当节点为叶子节点的时候更新答案
        if ((root->left == nullptr) && (root->right == nullptr))
        {
            ans = min(ans, cnt);
            return;
        }

        //如果不是叶子 -- cnt是局部变量,递归调用的时候会自动退回到当时的值
        dfs(root->left, cnt);
        dfs(root->right, cnt);
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值