思路——深度遍历
- 递归条件——结点为空
- 递归左右子树,寻找最大贡献路径
- 计算当前结点最大路径,更新答案
- 返回以当前结点 贡献较大那条路径
代码
class Solution {
private:
int maxSum = INT_MIN;
int maxGain(TreeNode* node) {
//递归结束条件
if (node == nullptr)
return 0;
//递归左右子树 获取正贡献度
int leftGain = max(maxGain(node->left), 0);
int rightGain = max(maxGain(node->right), 0);
// 更新答案 获取最大贡献度
maxSum = max(maxSum, node->val + leftGain + rightGain);
// 返回节点沿单个孩子的最大贡献度
return node->val + max(leftGain, rightGain);
}
public:
int maxPathSum(TreeNode* root) {
maxGain(root);
return maxSum;
}
};