题目
给你一棵二叉树,它的根为root
。请你删除 1 条边,使二叉树分裂成两棵子树,且它们子树和的乘积尽可能大。
由于答案可能会很大,请你将结果对 10^9 + 7 取模后再返回。
题解
思路:随意删除一条边,二叉树会分裂成某个结点的子树 + 剩下的部分。因此只需要递归求得所有的子树的结点和即可。
int maxProduct(TreeNode* root) {
vector<int> sum;
getsum(root, sum);
long max = 0;
for(auto num : sum){
long mul = (long)num * (sum.back() - num); // 注意利用类型转换避免溢出
if(mul > max) max = mul;
}
return (int)(max % 1000000007); // 返回int类型
}
int getsum(TreeNode* root, vector<int>& sum){ // 递归求子树和
if(root == nullptr)
return 0;
int ret = getsum(root->left, sum) + getsum(root->right, sum) + root->val;
sum.push_back(ret);
return ret;
}