- 題目:
給定一個非空二叉樹,返回其最大路徑和。
本題中,路徑被定義爲一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。
- 示例:
- 思路:
post-order-traversal(後序遍歷)變形題,left最大路徑和right最大路徑後更新最終結果的狀態。
採用遞歸,每遍歷一個節點,判斷左子樹和右子樹的值,如果子樹的值大於0,則加上子樹的值,同時利用全局變量maxv記錄遞歸過程中的最大值。
最小值:INT_MIN 1<<31
最大值:INT_MAX (1<<31)-1
- 代碼:
class Solution {
public:
int maxv=INT_MIN; //全局變量,保存最大和
int maxPathSum(TreeNode* root) {
if(root==NULL)
return 0;
calculate(root); //遞歸計算
return maxv;
}
int calculate(TreeNode* root){ //核心代碼
if(root==NULL) return 0;
int temp=root->val;
//後序遍歷
int lsum=calculate(root->left);
int rsum=calculate(root->right);
if(lsum>0) temp+=lsum;
if(rsum>0) temp+=rsum;
if(temp>maxv) maxv=temp; //更新最大和
return max(root->val,max(root->val+lsum,root->val+rsum));
}
};