递归
链接:二叉树中的最大路径和
算法思路
- 思路回忆:确定求解-最大路径和由该节点(与左右子节点不重复路径构成)
每个节点都拥有自己的贡献度,对于树上任意节点而言,其贡献度有两部分组成:1.该节点自身值 2. 左右子节点中贡献度较大的节点。
由此,递归求得每个节点自身的贡献度(节点自身+左、右其中一个节点路径),即可结合贡献度求解最大路径和(节点自身+左/右/左右节点路径)。 - 由此,代码模板如下:
class Solution {
// 最优路径由该节点与其左右不重复路径子节点构成
// 每个节点具有一定的贡献值,叶子节点的贡献值为本身,
// 其父节点贡献值为父节点值与左右节点中贡献值较大的一个,也可不包含左右子节点。
// 根据贡献值可以构建不重复路径
// 递归,深度遍历求解
int maxSum = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
maxGain(root);
return maxSum;
}
// 求解当前节点的最大贡献值,即只包括该节点与其不重复子节点路径
public int maxGain(TreeNode root){
if(root == null){
return 0;
}
TreeNode left = root.left;
TreeNode right = root.right;
int leftGain = maxGain(left);
int rightGain = maxGain(right);
maxSum = Math.max(maxSum,Math.max(0,leftGain)+Math.max(0,rightGain)+root.val);
return Math.max(Math.max(0,leftGain),Math.max(0,rightGain))+root.val;
}
}