题目描述
给你一棵二叉树,它的根为 root。请你删除 1 条边,使二叉树分裂成两棵子树,且它们子树和的乘积尽可能大。
由于答案可能会很大,请将结果对 10^9 + 7 取模后再返回。
示例
输入: root = [1,2,3,4,5,6] 输出: 110 解释: 删除红色的边,得到 2 棵子树,和分别为 11 和 10。它们的乘积是 110(11*10)
解题思路
采用深度优先搜索(DFS)遍历二叉树。核心步骤如下:
- 计算整棵树的节点总和
sum。 - 在 DFS 过程中,记录每个子树的和,存入列表。
- 遍历列表,对于每个子树和
subSum,计算分割后的乘积subSum * (sum - subSum)。 - 找出最大乘积并返回结果对 10^9 + 7 取模的值。
DFS 函数逻辑:
- 递归处理左子树和右子树,获取左右子树的和。
- 当前子树和 = 左子树和 + 右子树和 + 当前节点值。
- 将当前子树和加入列表。
- 返回当前子树和。
代码实现
/**
* 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 {
public:
const int MOD = 1e9 + 7;
long long dfs(TreeNode* root, vector<long long>& list){
long long l = 0;
long long r = 0;
long long temp = 0;
if (root -> left != nullptr){
l = dfs(root -> left, list);
}
if (root -> right != ){
r = (root -> right, list);
}
temp = l + r + root -> val;
list.(temp);
temp;
}
{
vector < > list;
sum = (root, list);
res = ;
( i:list){
cal = i * (sum - i);
(cal > res){
res = cal;
}
}
res % MOD;
}
};


