这道题一开始就没什么明确的正确想法,大致想着把树深度遍历,然后在遍历路径的上做文章,找到两条路径,这两条路径分别是树中部分结点相加之和第一大和第二大的路径。对这两条路径的头结点找最近公共祖先,然后看看这两条路径相连起来会不会是一个更大的和。找每条路径的基本思路来自求一个数组子数组的最大和题目。但最终感觉这么做下去太复杂了,也未必正确。
正确思路是,从下往上找,然后用一个数记录当前最大和。
1 class Solution { 2 public: 3 int sum; 4 int DFS(TreeNode* root) 5 { 6 int left=0,right=0,val=root->val; 7 if(root->left!=NULL) 8 left=DFS(root->left); 9 if(root->right!=NULL) 10 right=DFS(root->right); 11 if(left>0) 12 val+=left; 13 if(right>0) 14 val+=right; 15 if(val>sum) 16 sum=val; 17 return max(root->val,max(root->val+left,root->val+right)); 18 } 19 int maxPathSum(TreeNode* root) { 20 sum=root->val; 21 DFS(root); 22 return sum; 23 } 24 };