題目鏈接:click~
/*題意:給定一顆二叉樹,求最大路徑和。路徑可以從任意結點開始,任意結點結束*/
/**
*思路: 對於每個結點,需要比較三個值
* 1)左子結點爲結尾的路徑和+當前結點值
* 2)右子結點爲結尾的路徑和+當前結點值
* 3)當前結點值
*
* 計算以當前結點爲根時最大路徑和:
* 1)左子結點爲結尾的路徑和+當前結點值
* 2)右子結點爲結尾的路徑和+當前結點值
* 3)當前結點值
* 4)左子結點爲結尾的路徑和+當前結點值+右子結點爲結尾的路徑和
*/
class Solution {
public:
int getMaxSum(TreeNode *root, int& maxSum) {
if(root == NULL) return 0;
int leftSum = getMaxSum(root->left, maxSum); //左子結點爲結尾的路徑和
int rightSum = getMaxSum(root->right, maxSum);//右子結點爲結尾的路徑和
//分別對應1)、2)、3)、
int curSum = max(max(root->val+leftSum, root->val+rightSum), root->val);
//計算最大值
maxSum = max(maxSum, max(curSum, root->val+leftSum+rightSum));
return curSum;
}
int maxPathSum(TreeNode *root) {
if(root == NULL) return 0;
int maxSum = -0xfffffff;
getMaxSum(root, maxSum);
return maxSum;
}
};