标签:
/* * 124. Binary Tree Maximum Path Sum * 11.21 By Mingyang 刚开始想只用一个int * max来传参,但是后面发现无论怎么改,return的max都要被附上初值 * 所以我们这里出了一个全局变量,这里的任何一个path都要经过一个最高的点,那么这个最高的点就在 * root里面的node,那么每次都是最大的值更新。所以node表示一定经过的。 * 那么返回的整数就是如果最大的path还要通往父节点能提供的最大值。也就是我能提供给父节点一个接口, * 并且最大的值。 * 关键点1:明确递归函数的返回值是什么: * 这本题中返回值表示通过root节点能走到root的parent的最大和,这个值作为返回对象返给调用父函数 * 因为在Java中无法像C++一样引用传值或者利用指针传值,以前的解决办法是用全局变量 */ int maxValue; public int maxPathSum(TreeNode root) { maxValue = Integer.MIN_VALUE; maxPathDown(root); return maxValue; } private int maxPathDown(TreeNode node) { if (node == null) return 0; int left = Math.max(0, maxPathDown(node.left)); int right = Math.max(0, maxPathDown(node.right)); maxValue = Math.max(maxValue, left + right + node.val); /* * 这个地方可能有点疑惑,你可能会想 * -100 * 19 14 * 这种情况maxValue肯定还是19,那么为什么还要return 10+(-100)呢? * 那是因为maxValue才是我们最终需要的结果,这里的return的只是相当于为更上一级提供了一个接口 * 给他们提供一种更大的可能性,万一更上面的root是1000,那么这个接口就用上了。就可以获得正确的结果 * 所以我们这里需要的只是return一个可能性,并不影响最大的结果 */ return Math.max(left, right) + node.val; } //那你说我不用全局变量,那就只能用数组: public int maxPathSum1(TreeNode root) { int[] max = new int[1]; max[0] = Integer.MIN_VALUE; maxPathSum1(max, root); return max[0]; } private int maxPathSum1(int[] max, TreeNode root){ if(root == null) return 0; int leftMax = Math.max(0, maxPathSum1(max, root.left)); int rightMax = Math.max(0, maxPathSum1(max, root.right)); max[0] = Math.max(max[0], root.val+leftMax+rightMax); return root.val+Math.max(leftMax,rightMax); }
124. Binary Tree Maximum Path Sum
标签:
原文地址:http://www.cnblogs.com/zmyvszk/p/5516070.html