求一个二叉树的最小深度,最大深度。

104. 二叉树的最大深度

111. 二叉树的最小深度

推荐的写法:

 求一个二叉树的最大深度

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

求一个二叉树的最小深度

class Solution {
public:
    int minDepth(TreeNode* root) {
        if(!root)   return 0;
        if(!root->left) return 1+minDepth(root->right);
        if(!root->right) return 1+minDepth(root->left);
        return 1+min(minDepth(root->left),minDepth(root->right));
    }
};

 

自己的错误积累

求二叉树最小深度的时候,和二叉树最大深度相比,如果采用同样的递归方式,我这里用的回溯法的写法(后来我思考其实直接考虑递归就可以,而是是只向下递而不往回归,因为是统计路程的最短距离, 每一条路径都可以,突然想到一些剪枝优化,如果用回溯也可以,设置一个变量,如果计算当前深度已经大于了最优解,就不再继续递归下去了),其实就是dfs。

class Solution {
public:
    int minDepth(TreeNode* root) {
        if(!root)   return 0;
        int mindepth = INT_MAX;
        dfs(mindepth,0,root);
        return mindepth;
    }
    void dfs(int& mindepth,int depth,TreeNode* root){
        if(!root){
            if(depth < mindepth)    
                mindepth = depth;
                return;
        }
        dfs(mindepth,depth+1,root->left);
        dfs(mindepth,depth+1,root->right);
    }
};

会暴露一个问题,当用例[1,2]时,返回值应该是2,然而返回值是1。这是因为没有弄清楚一个概念:什么是叶子结点?

叶子结点是指没有子结点的结点。如果简单的用if(!root)就来判断,如下图结点元素值为2的结点。此时向右深搜,发现为NULL,记录下来,此时误以为最小深度就是2,实际上并不是,因为2都不是叶子结点,怎么能说二叉树的最小深度是2呢?

那为什么在求最大深度的时候没事呢?因为你求的是最大的深度。。即使你保存了一个到非叶子结点的路径长度,可是只要你不断向下深搜,总会找到一个最大的到叶子结点的路径长。

当我意识到用例[1,2]的错误之后,立马对代码进行了修改,直接在minDepth中加了一句:

if(!root->left || !root->right) return mindepth+1;

当然,又出现了大问题,如果root就是叶子结点呢?比如说用例[1],这时导致又多加了1,这难不倒我,又加了一句:

 

if(!root->left || !root->right) return mindepth+1;

这时候代码如下,可是此时又出错了,出错的用例就可以用它说明

你只在minDepth函数中去关心的了root的左右孩子的是否为NULL的问题,而实际上!这时一个递归的过程。也就是说如果是结点元素值为5的结点呢?还不是会发生上述的问题!这时候我就想明白了!必须在递归函数dfs()做出约束!而不是在调用递归的函数minDepth()中约束,这是没有了解递归的意义啊!

class Solution {
public:
    int minDepth(TreeNode* root) {
        if(!root)   return 0;
        int mindepth = INT_MAX;
        dfs(mindepth,0,root);
        if(!root->left && !root->right)   return mindepth;
        if(!root->left || !root->right) return mindepth+1;
        return mindepth;
    }
    void dfs(int& mindepth,int depth,TreeNode* root){
        if(!root){
            if(depth < mindepth)    
                mindepth = depth;
                return;
        }
        dfs(mindepth,depth+1,root->left);
        dfs(mindepth,depth+1,root->right);
    }
};

所以我立马上网查看了别人的答案,写出了最上面的解答。收获还是不少的!更加熟悉了递归的意义!而且针对叶子结点也了解了一些!所以说

if(!root)   return ...;

这个条件并不是意味着你已经访问到了叶子结点,而是你已经访问到了NULL结点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值