这个题可以和二叉树的最长直径联系起来看,就能知道为什么要这么写了,整理这道题是因为我有一句一直看不太明白,现在差不多理清楚了所以整理一下。
这道题要求二叉树的最短路径,所以从根本上来讲还是递归求解最简单
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;来保证正确性