class Solution {
public:
    int maxSum = INT_MIN;
    int maxPathSum(TreeNode* root) {
        dfs(root);  
        return maxSum;
    }
    int dfs(TreeNode* root) { // 返回以root开头为节点的最大路径长度
        if(!root) return 0;
        int left = max(dfs(root->left), 0); // 分支是否有选取的必要,至少大于0
        int right = max(dfs(root->right), 0);
        maxSum = max(maxSum, left+right+root->val); // 选取中间节点相连的和
        return max(left, right) + root->val;// 选取最大分支构成root开头最大路径长
    }
};