題目大意:求二叉樹中最大路徑和,路徑可以從任意任意節點出發,到任意節點結束。
分析: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); //返回節點最大貢獻值
}
};