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;来保证正确性

  • 相关阅读:
    关于 省赛模拟赛(迪迦桑专场)
    ZOJ3878: Convert QWERTY to Dvorak(浙江省赛2015)
    Is It A Tree?
    Escape
    关于细节
    [UE4]AnimDynamics简介
    [UE4]武器碰撞
    [UE4]CustomAnimationBlueprintNode 自定义动画蓝图节点
    百钱买白鸡
    asp.net 标准控件的重要属性
  • 原文地址:https://www.cnblogs.com/kerwins-AC/p/14458630.html
Copyright © 2011-2022 走看看