这道题关键突破点就是先算出节点总和,然后找到一颗子树总和最接近总和的一半。
乘积最大基本就是先要求总和,然后找到最接近总和一半。
关键就是这一步,找到最适合子树的和。
点击查看代码
if(abs(2*cur-sum)<abs(2*best-sum)){
best=cur;
}
点击查看代码
class Solution {
public:
int sum=0;
int best=0;
void bfs1(TreeNode*root){
if(!root){return ;}
sum+=root->val;
bfs1(root->left);
bfs1(root->right);
}
int bfs2(TreeNode*root){
if(!root){return 0;}
int cur=root->val+bfs2(root->left)+bfs2(root->right);
if(abs(2*cur-sum)<abs(2*best-sum)){
best=cur;
}
return cur;
}
int maxProduct(TreeNode* root) {
bfs1(root);
int k=bfs2(root);
return best*(sum-best);
}
};