题目
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例1
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例2
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
思路
- 递归到叶子节点,逐级返回。返回值为当前节点的值加上,分别以左、右孩子为根节点的最大路径和中较大的那一个。如果这个值为负数,则返回0,因为为负的路径值对父节点的最大路径和没有帮助。
- 计算每个节点的左、右孩子为根节点的最大路径和。因为左、右孩子返回的值只能为0或者大于0的数,所以直接用当前节点的值加上左右孩子返回的值。更新最大值。接着该节点的返回值同1。这样就可以计算每一个节点的最大路劲和。
代码
class Solution {
private:
int maxSum = INT_MIN;
public:
int maxPathSum(TreeNode* root) {
helper( root );
return maxSum;
}
int helper( TreeNode* node ) {
if ( node == nullptr )
return 0;
int left = helper( node->left );
int right = helper( node->right );
maxSum = max( maxSum, left + right + node->val );
int res = max( left, right ) + node->val;
return res > 0 ? res : 0;
}
};