leetcode124——Binary Tree Maximum Path Sum

題目大意:求二叉樹中最大路徑和,路徑可以從任意任意節點出發,到任意節點結束。

分析:dfs。維護全局maxSum,對每個節點求最大路徑。經過該節點的最大路徑=節點值+leftGain+rightGain。LeftGain、RightGain分別爲左右子節點的最大貢獻值。節點最大貢獻值=節點值+max(leftGain,rightGain),因爲貢獻值代表該節點左側路徑or右側路徑二選一,選擇一條貢獻值最大的繼續往該節點的父節點貢獻。

代碼:

/**
 * 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 {
    int maxSum = INT_MIN;
public:
    int maxPathSum(TreeNode* root) {
        dfs(root); //dfs求每個節點最大貢獻值,並在過程中更新maxSum
        return maxSum;
    }
    int dfs(TreeNode* root) {
        if(!root) return 0;
        int leftGain = max(dfs(root->left),0); //貢獻值最小爲0(節點值可能爲負)
        int rightGain = max(dfs(root->right),0);
        maxSum = max(maxSum,root->val + leftGain + rightGain); //更新經過root的最大路徑值
        return root->val + max(leftGain,rightGain); //返回節點最大貢獻值
    }
};

 

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