递归。
递归时,将每个结点作为一个根结点传入递归函数。对于当前的这个结点,以它为根结点,计算它左子树路径的最大和,右子树路径的最大和。通过这个结点,当前是看做是以它根结点,这个结点的最大路径和就是:左子树最大路径和(大于0的话)+右子树最大路径和(大于0的话)+根结点的值。然后更新当前计算的MAX是多少,也就是我们的结果。
递归函数的返回值是:当前这个结点的左子树最大路径和,或者是右子树最大路径和。再加上结点值。因为,这样得到的一条最大路径,就可以作为这个结点的父节点的一条路径,用于父节点的计算。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int max_res;
int maxPathSum(TreeNode *root) {
if(root == nullptr)
return 0;
max_res = INT_MIN;
maxsum(root);
return max_res;
}
int maxsum(TreeNode* root)
{
if(root == nullptr)
return 0;
int left_max = max(0,maxsum(root->left));
int right_max = max(0,maxsum(root->right));
max_res = max(max_res,left_max + right_max + root->val);
return max(left_max,right_max) + root->val;
}
};