/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/classSolution{// 在递归过程中,维护一个需要返回的 max 值int max =Integer.MIN_VALUE;publicintmaxPathSum(TreeNode root){forMax(root);return max;}intforMax(TreeNode root){if(root ==null){returnInteger.MIN_VALUE;}// 先往左右子结点走int left =forMax(root.left);int right =forMax(root.right);// ans:用于维护 max,可能已经不能往上走了(已经走了左右子树)int ans = root.val;// 不一定取,因为可能是负数
ans += left >0? left :0;
ans += right >0? right :0;
max =Math.max(ans, max);// forPa:用于给上层结点,一定不是同时走了左右子树的路径int forPa = root.val;// 最多只能走一边:走左 or 右 or 不走int add = left > right ? left : right;if(add >0){
forPa += add;}// 返回往上走的可行路径最大值return forPa;}}
更新版
照例感叹之前写的代码怎么这么冗余。。
classSolution{int max =Integer.MIN_VALUE;publicintmaxPathSum(TreeNode root){maxPath(root);return max;}publicintmaxPath(TreeNode root){if(root ==null){return0;}int left =Math.max(0,maxPath(root.left));int right =Math.max(0,maxPath(root.right));
max =Math.max(root.val + left + right, max);returnMath.max(left + root.val, right + root.val);}}