题目详情
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
——题目难度:困难
感觉发现了 力扣每日一题 一到周末 官方就会放困难难度的题...
总体思路如下:
-代码如下
class Solution {
public:
int maxPathSum(TreeNode* root) {
int Max = INT_MIN;
RemaxPathSum(root, Max);
return Max;
}
int RemaxPathSum(TreeNode* root, int &Max) {
if (root == NULL) return 0;
//max(0,val)是为了消除有负数的影响
int left = max(0, RemaxPathSum(root->left, Max));
int right = max(0, RemaxPathSum(root->right, Max));
//lmr为该节点 左中右 的值
int lmr = root->val + left + right;
//ret为 该节点的最大贡献值
int ret = root->val + max(left, right);
Max = max(Max, max(lmr, ret)); //这里其实可以不用对lmr和ret进行比较,因为left和right一定是大于等于0的,所以lmr一定大于等于ret
return ret; //返回 该节点的最大贡献值
}
};
结果