1、动态规划法
我们可以这样来分解问题,我们定义maxSum用于记录以root为根节点的二叉树中的最大路径和。我们给每个节点定义一个优先级 r o o t − > v a l + m a x ( l e f t G a i n , r i g h t G a i n ) root->val + max(leftGain, rightGain) root−>val+max(leftGain,rightGain),用于比较选择该节点之后的最大路径和,由于root节点的左右孩子未必都在最大路径中,因此我们只以其中的最大值拿来进行比较。同时我们在每一次递归中使用变量priceNewPath记录以root为根节点的子树中的最大路径和并与maxSum进行比较,若更大则进行更新,最终能够递归遍历整棵树。
class Solution {
public:
int maxSum = INT_MIN;
int maxGain(TreeNode *root) {
if (!root) return 0;
int leftGain = max(maxGain(root->left), 0);
int rightGain = max(maxGain(root->right), 0);
int priceNewPath = root->val + leftGain + rightGain;
maxSum = max(maxSum, priceNewPath);
return root->val + max(leftGain, rightGain);
}
int maxPathSum(TreeNode *root) {
maxGain(root);
return maxSum;
}
};