題目地址:https://leetcode.com/problems/binary-tree-maximum-path-sum/#/description
題目描述:Given a binary tree, find the maximum path sum.
For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path must contain at least one node and does not need to go through the root.
我的代碼:
/**
* 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 dfs(TreeNode* root,int& sum){
if(!root) return 0;
int left=dfs(root->left,sum);
int right=dfs(root->right,sum);
int m=root->val;
if(left>0) m+=left;
if(right>0) m+=right;
if(m>sum) sum=m;
if(max(left,right)<0) return root->val;
else return max(left,right)+root->val;
}
int maxPathSum(TreeNode* root) {
if(!root) return 0;
int sum = root->val;
dfs(root,sum);
return sum;
}
};
解題思路:
採用遞歸的思想。用sum來記錄所有中間過程中的最大路徑和,一旦出現更大的值才替換它。由於至少有一個點,所以用根節點的值來初始化sum。
可以想到,最長路徑一定包括一個子樹的根節點,因爲我們在遞歸的過程中會將每一個點都當做根節點。所以對於遞歸的我們只需考慮包含根節點的情況。這樣的情況分爲兩種,
第一種是假設最長路徑並不是在這個子樹中,但這個子樹包含最長 路徑的一部分,如此,就獲得一條以該根節點爲端點的最長路徑,並作爲返回值。
第二種情況是假設最長路徑就在這個子樹中。於是可以對左子樹的返回值,右子樹的返回值,根節點的值做判斷,看其最大的情況下是否大於當前的sum,如果大於,更新sum即可。
該算法對整個樹遍歷了一遍,複雜度爲O(n)。