二叉树最大深度与最小深度

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回它的最大深度 3 。

 

第一个能想到的解法就是用递归求解,做完发现大部分人也都是用的递归思想,或者间接用的递归,也有用迭代法做的,主要记录一下递归就好了。

class Solution {
public:
    int maxDepth(TreeNode* root) {
        int L=0,R=0;
        if(root == NULL)
            return 0;
        else
        {    
            L = maxDepth(root->left);
            R = maxDepth(root->right);
            return (L>R?L:R)+1;
        }
    }
};

看见一个代码极度浓缩成一行的(java)

class Solution {
public:
    int maxDepth(TreeNode* root) {
        return (root==NULL)? 0:max(maxDepth(root->left),maxDepth(root->right))+1;
    }
};


作者:xia-gu-zhen-zhen

 

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回它的最小深度  2.

 

 

本来以为这个题只需要改个条件就行了,没想到踩了一个坑,而且发现不止我一个人。

先前踩坑的代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int minDepth(TreeNode* root) {
        int L=0,R=0;
        if(root == NULL)
            return 0;
        else
        {    
            L = minDepth(root->left);
            R = minDepth(root->right);
            return (L<R?L:R)+1;
        }
    }
};

                                                                                                                                                                                                           坑:在输入样例为【1,2】的时候,按照之前对题意的理解,生成的是一颗单支树 ,结果应该是这左右子树较小的那一颗的高度+1,但是这里预期输出却是2,看了一下大家的讨论,题意应该是要求在这种情况下,单支树的最小高度应该是这颗树的高度,而不是空子树的高度+1

在这里做出调整:
 

class Solution {
public:
    int minDepth(TreeNode* root) {
        int L=0,R=0;
        if(root == NULL)
            return 0;
        else
        {    
            L = minDepth(root->left);
            R = minDepth(root->right);
            return (L&&R)?(L<R?L:R)+1:L+R+1;
        }
    }
};

最后返回的时候,通过&运算,若其中一个空0,即出现单支树的情况,树的最小高度为L+R+1,这里因为有一颗子树为空,因此L+R+1实际上是求得单支树的高度加根结点,若不为空就返回两子树中较矮的一棵树的高度+1;

 

执行用时 :16 ms, 在所有 C++ 提交中击败了61.79%的用户

内存消耗 :19.5 MB, 在所有 C++ 提交中击败了86.14%的用户

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值