题目
题解
这里的路径和一般理解的路径不太一样,它是从任意结点开始的,不一定包含根结点
如果我们自顶向下寻找最大路径和,会出现路径重叠的问题,因此考虑自底向上的递归解决
对于如下图所示的三个结点,采用自底向上方式,路径可能为:b+c+a,b+a,c+a三种,总之一定会经过根节点a,于是可以得出一个子树内部的最大路径和 = 左子树提供的最大路径和 + 根节点值 + 右子树提供的最大路径和,即dfs(root.left)+root.val+dfs(root.right)
class Solution {
int max=Integer.MIN_VALUE;
public int maxPathSum(TreeNode root){
dfs(root);
return max;
}
public int dfs(TreeNode root) {
if(root==null)
return 0;
int leftVal=Math.max(0,dfs(root.left));//左子树路径最大值,大于0时才会选择该结点
int rightVal=Math.max(0,dfs(root.right));//右子树路径最大值
int lmr=root.val+leftVal+rightVal;//左根右的路径值
max=Math.max(max,lmr);//更新全局最大路径和
return root.val+Math.max(leftVal,rightVal);//由于要往上返,所以不能同时占着左右子,要选个最大的
}
}
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
树的困难题,有动态规划的意思,难的是思路,代码倒是不多…