124. 二叉樹中的最大路徑和 leetcode

給定一個非空二叉樹,返回其最大路徑和。

本題中,路徑被定義爲一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。

示例 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));
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章