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

原文地址:https://www.cnblogs.com/kerwins-AC/p/14458630.html