路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。

提示:
Node.val <= 1000/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
int val = INT_MIN;
public:
// 自底向上构建,每个结点返回自己的贡献值
// 比自上向下要节省时间
int dfs(TreeNode* root){
// 0 ——避开INT_MIN + INT_MIN
if(! root) return 0;
// 呼应 0(意义:值为非正无贡献)
// 左树贡献
int l = max(0, dfs(root->left));
// 右树贡献
int r = max(0, dfs(root->right));
// 返回值是关键:
// l+r+root->val 是以当前此结点为起点的路径 的最大值
val = max(val, l+r+root->val);
// KEY !!!!!!!!!!!
// max(l, r): 因为程序栈LIFO,即从高一层的root往下走,不能重复经过某一结点
// 所以结点贡献值是要选择左右子树某一棵
return root->val+max(l, r);
}
int maxPathSum(TreeNode* root) {
dfs(root);
return val;
}
};
