难度: 困难(感觉不到)
题目:
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
示例:
1
/ \
2 3
最优路径 2->1->3,和为6
示例:
-10
/ \
9 20
/ \
15 7
最优路径15->20->7,和为42
解题:
一个节点的贡献值,是它本身的值加上子节点贡献值(左子节点或右子节点取较大)。
比如上面的示例,对于20这个节点,它的贡献值就是15+20 = 35,这个结果还需要和0作比较,小于0的话就舍弃,因为小于0的话对最终的最大路径和没有贡献。
每个节点都要计算一次结果,最终的结果需要使用一个全局变量来计算,结果的计算公式如下:
class Solution {
public:
int iResult = INT_MIN;
int maxPathSum(TreeNode* root) {
maxSum(root);
return iResult;
}
int maxSum(TreeNode *root)
{
if(root == nullptr)
return 0;
// 如果小于0就舍弃
int iLeft = max(0,maxSum(root->left));
int iRight = max(0,maxSum(root->right));
iResult = max(iResult,root->val + iLeft + iRight);
// 左右只能选择一个分支
return root->val + max(iLeft,iRight);
}
};