給定一個非空二叉樹,返回其最大路徑和。
本題中,路徑被定義爲一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。
示例 2:
輸入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
輸出: 42
思路:
每個節點都有兩個狀態:
1,到這裏還得往上走,此時自然不可能會有從該節點左邊到右邊的路線(因爲要往上走),記爲該節點的x值。
2,到這裏就不往上走了,記爲該節點的y值。
每個節點的x值等於max(本節點的值,左子節點的x值,右子節點的x值)
每個節點的y值等於max(本節點的值,左子節點的y值,右子節點的y值, 本節點的值+左子節點的x值+右子節點的x值,本節點的值+左子節點的x值,本節點的值+右子節點的x值)PS:後面兩個紅色的是因爲某些節點可能只有一個子節點 。
最後求根節點的max(x,y)即可
/**
* 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_(int x, int y, int w){
int a = max(x, y);
return max(a, w);
}
int max_4(int x, int y, int w, int z, int a, int b){
int c = max(x, y);
int d = max(w, z);
int h = max(a, b);
return max_(c, d, h);
}
vector<int> treeDp(TreeNode* root){
vector<int>ans;
if(root->left || root->right){
vector<int>node={-9999999,-9999999};
vector<int>leftN = root->left?treeDp(root->left):node;
vector<int>rightN = root->right?treeDp(root->right):node;
int nonStop = root->val + max_(0, rightN.at(0), leftN.at(0));
int stop = max_4(root->val, leftN.at(1), rightN.at(1), leftN.at(0) + rightN.at(0) + root->val, root->val + leftN.at(0), root->val+rightN.at(0));
ans.push_back(nonStop);
ans.push_back(stop);
return ans;
}
ans.push_back(root->val);
ans.push_back(root->val);
return ans;
}
int maxPathSum(TreeNode* root) {
vector<int>ans = treeDp(root);
return max(ans.at(0), ans.at(1));
}
};