这个题看了很多遍,感谢大佬们。
注意点:
1.深度遍历的是包括当前节点在内向下的最大节点和,因此可以避免重复计算。
2.更新的是最大路径和跟遍历的有点不一样,遍历向下的最大节点和只能选单边,路径是可以两边。
重点需要了解的是max(0,getMax(root->left))起到子节点为负数时忽略的功能。
/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    int res = INT32_MIN;
    int maxPathSum(TreeNode* root) {
        getMax(root);    
        return res;
    }
    

    int getMax(TreeNode* root){
        if(root==NULL){
            return 0;
        }
        
        if(root->left == NULL && root->right == NULL){
            res = max({res,root->val});
            return root->val;
        }
        
        int leftMax = 0;
        int rightMax = 0;
        
        leftMax = max(0,getMax(root->left));
        rightMax = max(0,getMax(root->right));
        
        res = max({res,root->val+leftMax+rightMax});
        return root->val+max(leftMax,rightMax);
    }
};