题目
思路
这道题我们可以考虑用递归来解决。
首先设计一个maxPath函数用来递归计算二叉树中一个节点的最大贡献值,具体来说,就是以该节点为根节点的子树中寻找以该节点为起点的一条路径,使得该路径上的节点值之和最大。
如果该节点为空,则最大贡献值为0。
如果非空,最大贡献值就等于节点值与其子节点中的最大贡献值之和
过程分析
假设二叉树如下
递归步骤:
1. 节点 20:
- 左子树:空,leftGain = 0。
- 右子树:空,rightGain = 0。
- sum = 20 + 0 + 0 = 20。
- 更新 maxsum = max(INT_MIN, 20) = 20。
- 返回 20 + max(0, 0) = 20。
2. 节点 1:
- 左子树:空,leftGain = 0。
- 右子树:节点 3。
节点 3:
- 左子树:空,leftGain = 0。
- 右子树:空,rightGain = 0。
- sum = 3 + 0 + 0 = 3。
- 更新 maxsum = max(20, 3) = 20。
- 返回 3 + max(0, 0) = 3。
- rightGain = 3。
- sum = 1 + 0 + 3 = 4。
- 更新 maxsum = max(20, 4) = 20。
- 返回 1 + max(0, 3) = 4。
3. 节点 2:
- 左子树:节点 20,leftGain = 20。
- 右子树:节点 1,rightGain = 4。
- sum = 2 + 20 + 4 = 26。
- 更新 maxsum = max(20, 26) = 26。
- 返回 2 + max(20, 4) = 22。
4. 节点 10(根节点):
- 左子树:节点 2,leftGain = 22。
- 右子树:节点 10。
节点 10:
左子树:空,leftGain = 0。
右子树:节点 -25。
节点 -25:
左子树:空,leftGain = 0。
右子树:空,rightGain = 0。
sum = -25 + 0 + 0 = -25。
更新 maxsum = max(26, -25) = 26。
返回 -25 + max(0, 0) = -25。
rightGain = 0(因为 -25 是负数,被置为 0)。
sum = 10 + 0 + 0 = 10。
更新 maxsum = max(26, 10) = 26。
返回 10 + max(0, 0) = 10。
rightGain = 10。
sum = 10 + 22 + 10 = 42。
更新 maxsum = max(26, 42) = 42。
返回 10 + max(22, 10) = 32。
最大路径和为 42
,路径为 20 -> 2 -> 10 -> 10
。
代码
class Solution {
private:int maxsum = INT_MIN;
public:int maxPathSum(TreeNode* root) {maxPath(root);return maxsum;}int maxPath(TreeNode* node){ if(node == nullptr)return 0;int leftGain = max(maxPath(node->left),0);int rightGain = max(maxPath(node->right),0);int sum = node->val + leftGain + rightGain;maxsum = max(maxsum,sum);return node->val + max(leftGain, rightGain);}
};