給定一個非空二叉樹,返回其最大路徑和。
本題中,路徑被定義爲一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。
示例 1:
輸入: [1,2,3]
1
/ \
2 3
輸出: 6
示例 2:
輸入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
輸出: 42
思路:
這題注意遞歸的方法,使用子樹最長路徑(包含子樹根節點,保證連續)遞歸,而不是直接用最長路徑遞歸
對於任意一個節點, 如果最大和路徑包含該節點, 那麼只可能是兩種情況:
1. 其左右子樹中所構成的和路徑值較大的那個加上該節點的值後向父節點回溯構成最大路徑
2. 左右子樹都在最大路徑中, 加上該節點的值構成了最終的最大路徑
/**
* 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 {
public:
int max_num = INT_MIN;
int maxPathSum(TreeNode* root) {
maxSinglePath(root);
return max_num;
}
int maxSinglePath(TreeNode* root){
if(!root) return 0;
// 得到左右兩邊,單邊最大路徑和,這裏只有大於0,纔有意義,所以和0取了max
int left = max(0,maxSinglePath(root->left));
int right = max(0,maxSinglePath(root->right));
max_num = max(max_num,root->val+left+right);
return max(root->val+left,root->val+right);
}
};