zoukankan      html  css  js  c++  java
  • #leetcode111.二叉树的最小深度

     这个题可以和二叉树的最长直径联系起来看,就能知道为什么要这么写了,整理这道题是因为我有一句一直看不太明白,现在差不多理清楚了所以整理一下。

    这道题要求二叉树的最短路径,所以从根本上来讲还是递归求解最简单

    int left = minDepth(root.left);

    int right = minDepth(root.right);

    这样可以先到达左节点的最深的一个叶子节点,然后递归往上。

    看下代码:

    public int minDepth(TreeNode root) {
            if( root == null)
                return 0;
            int left = minDepth(root.left);
            int right = minDepth(root.right);
            if(left == 0 || right ==0)
                return left + right + 1;
            return Math.min(left, right) + 1;
    
        }

    这句 if(left == 0 || right ==0) return left + right +1;

    这一句写的十分的巧妙,避免了左节点还是右节点为空的判断,一句话表述清楚,至于为什么要加这一个判断呢,看下求最长路径的部分代码:

    public int maxDepth(TreeNode root) {
    
            if (root == null)
                return 0;
    
            int left = maxDepth( root.left );
            int right = maxDepth( root.right );
    
            max = Math.max( max, left + right);
    
            return Math.max(left, right) + 1;
    
        }

    是用一个全局变量来记录树的所有可能的最长直径;而return的时候用的是return Math.max(left,right)+1;就是左右子节点哪个树高更高就返回哪个+1;合理;

    但是放在我们这个题目里面适用吗?

    如果我们沿用这个的思路,return Math.min(left,right)+1;会有问题吗?会,就是一旦某个节点的左节点或者右节点只有一个节点为空,那么递归到这个节点的时候,其实就会前功尽弃了!

    因为 Math.min(left,right)的时候,无论如何比不过为0的,就会导致前面的计算都会失效,而此时出来的长度根本不是叶子节点的路径,所以会出问题,

    综述这里应该加一个对这种特殊情况的处理, if(left ==0 || right ==0) return left + right +1;来保证正确性

  • 相关阅读:
    监视和调整硬件性能
    ASP.NET MVC三个重要的描述对象:ActionDescriptor
    REST in Practice
    软硬件错误的排查之道
    OMCS 多媒体连接系统
    逻辑层 vs 物理层
    深入浅出裸测之道单元测试的单元化
    简单的网络爬虫实现
    WCF返回JSON与传入JSON(普通参数或对象)
    .NET程序员的一个礼物——TypeMonster
  • 原文地址:https://www.cnblogs.com/kerwins-AC/p/14458630.html
Copyright © 2011-2022 走看看