题目大意:求二叉树中最大路径和,路径可以从任意任意节点出发,到任意节点结束。
分析:dfs。维护全局maxSum,对每个节点求最大路径。经过该节点的最大路径=节点值+leftGain+rightGain。LeftGain、RightGain分别为左右子节点的最大贡献值。节点最大贡献值=节点值+max(leftGain,rightGain),因为贡献值代表该节点左侧路径or右侧路径二选一,选择一条贡献值最大的继续往该节点的父节点贡献。
代码:
/**
* 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 {
int maxSum = INT_MIN;
public:
int maxPathSum(TreeNode* root) {
dfs(root); //dfs求每个节点最大贡献值,并在过程中更新maxSum
return maxSum;
}
int dfs(TreeNode* root) {
if(!root) return 0;
int leftGain = max(dfs(root->left),0); //贡献值最小为0(节点值可能为负)
int rightGain = max(dfs(root->right),0);
maxSum = max(maxSum,root->val + leftGain + rightGain); //更新经过root的最大路径值
return root->val + max(leftGain,rightGain); //返回节点最大贡献值
}
};