【LeetCode 剑指Offer】 二叉树的最大与最小深度

博客围绕二叉树的最大深度和最小深度求解展开。对于最大深度,给出了计算思路,即二叉树深度等于左右子树深度最大值加1。对于最小深度,指出简单类比最大深度会出错,需增加判断左右结点是否为空的步骤,根据不同情况计算最小深度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求最大深度和最小深度。

 

最大深度

题目:

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

 

思路:

1,一个二叉树的深度 = 以根节点为root的子树的深度 = max ( 以root->left为root的子树的深度, 以root->right为root的子树的深度 ) + 1

2,如果一个节点为空,则该节点深度为0,或者说如果一个节点没有左右子树,则该节点深度为1

 

    int TreeDepth(TreeNode* pRoot)
    {
        if(!pRoot)     // 如果到达了空结点,则返回0深度
            return 0;
        int left = TreeDepth(pRoot->left);
        int right = TreeDepth(pRoot->right);
        return max(left, right) + 1;
    }

 

最小深度

最小深度简单思考可以认为是最大深度类似问题,即一个树的最小深度等于左右子数的最小深度+1。

稍加修改:

    int TreeDepth(TreeNode* pRoot)
    {
        if(!pRoot)     // 如果到达了空结点,则返回0深度
            return 0;
        int left = TreeDepth(pRoot->left);
        int right = TreeDepth(pRoot->right);
        return min(left, right) + 1;
    }

这么做其实与题意不符。最小深度必须要到达一个叶结点,如果一个结点只有单侧结点,上述方法会直接停止,得到错误的最小深度。见下图:

 

故需要修改,增加判断当前结点的左右结点是否为空:

(1)若有一个为空,则取另一侧的最小长度+1(而不是之前那样取为空位置的深度)

(2)当左右均不为空时再取两者的最小深度。

    int run(TreeNode *root) {
        if (!root)
            return 0;
        if (!root->left)
            return run(root->right)+1;
        if (!root->right)
            return run(root->left)+1;
        return min(run(root->left), run(root->right)) + 1;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值