对于树的题目练习的太少,一般就是dfs,这里也是如此,采用递归来实现。不过我们递归的返回值不是我们所需要的值,我们所需要的值是需要在递归函数里面进行更新,这一步很重要,要能分清楚。
import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */ public class Solution { /** * * @param root TreeNode类 * @return int整型 */ int max=Integer.MIN_VALUE; public int maxPathSum (TreeNode root) { // write code here maxPath(root); return max; } public int maxPath (TreeNode root) { if(root==null) return 0; // 只有在最大贡献值大于 0 时,才会选取对应子节点 int maxLeft=Math.max(0,maxPath(root.left)); int maxRight=Math.max(0,maxPath(root.right)); //max是要返回的值,所以要把maxLeft和maxRight以及root.val加起来然后更新 max=Math.max(max,root.val+maxRight+maxLeft); //返回节点的最大贡献值 该节点要和其他节点连起来 返回的是Math.max(maxRight,maxLeft)+root.val而不是root.val+maxRight+maxLeft //这里不能和上面对max更新弄混 return Math.max(maxRight,maxLeft)+root.val; } }maxPath的最后两行代码要着重理解,理解递归函数的返回值不是我们需要返回的结果,返回的结果是需要在递归函数中更新出来进行返回,递归只是我们更新结果的步骤。