不算难,什么时候乘积最大呢?由于a+b=固定的,ab最大只有在|a-b|最小时候才会发生。
/**
* 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:
// 当左右子树和sum1 sum2相差最小时,成绩最大。
// 返回每个结点的和
// res保存每个点从root开始,所有结点的和。
int sum(TreeNode* root, vector<int>& res){
if (root==NULL){
return 0;
}
int leftsum = sum(root->left, res);
int rightsum = sum(root->right, res);
int result = root->val+leftsum+rightsum;
res.push_back(result);
return result;
}
int maxProduct(TreeNode* root) {
vector<int> res;
int allsum = sum(root, res);
// for debug
/*
for(int i=0;i<res.size();i++){
cout<<res[i]<<" ";
}
cout<<endl;
cout<<allsum<<endl;*/
int startnum = 0;
int mindiff = 1e9+8;
for(int i=0;i<res.size();i++){
if (mindiff > abs(allsum-2*res[i])){
mindiff = abs(allsum-2*res[i]);
startnum = res[i];
}
}
int mod = 1e9+7;
long finalres = long(startnum)*long(allsum-startnum)%mod;
return finalres;
}
};