1339. 分裂二叉树的最大乘积
代码/思路
思路:
- 计算所有结点的和 sum
- 把点 a 和 b 分开,以 a 为根结点的子树和为sum1;以b为根结点的子树和sum2为sum - sum1
- 枚举不同的 a 并计算 sum1;
- 找到最大的sum1 * sum2
技巧:a * (sum - a)想要最大,那么a 应该尽可能的接近 sum 的一半
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
int sum = 0;
int best = 0;
//利用深搜计算结点总和
void dsf(TreeNode* root)
{
//如果是空树
if(!root)
{
return;
}
sum += root->val;
dsf(root->left);
dsf(root->right);
}
int dsf2(TreeNode* root)
{
if(!root)
{
return 0;
}
//递归地计算每个子树的和
int cur = dsf2(root->left) + dsf2(root->right) + root->val;
//每次找到最解决总和一半的子树和
best = abs(2 * cur - sum) < abs(2 * best - sum) ? cur : best;
return cur;
}
public:
int maxProduct(TreeNode* root) {
dsf(root);
dsf2(root);
return (long long) best * (sum - best) % 1000000007;
}
};