给你一棵二叉树,它的根为 root 。请你删除 1 条边,使二叉树分裂成两棵子树,且它们子树和的乘积尽可能大。
由于答案可能会很大,请你将结果对 10^9 + 7 取模后再返回。
示例 1:
输入:root = [1,2,3,4,5,6]
输出:110
解释:删除红色的边,得到 2 棵子树,和分别为 11 和 10 。它们的乘积是 110 (11*10)
示例 2:
输入:root = [1,null,2,3,4,null,null,5,6]
输出:90
解释:移除红色的边,得到 2 棵子树,和分别是 15 和 6 。它们的乘积为 90 (15*6)
示例 3:
输入:root = [2,3,9,10,7,8,6,5,4,11,1]
输出:1025
示例 4:
输入:root = [1,1]
输出:1
提示:
每棵树最多有 50000 个节点,且至少有 2 个节点。
每个节点的值在 [1, 10000] 之间。
链接:https://leetcode-cn.com/problems/maximum-product-of-splitted-binary-tree
思路分析:
这道题主要的点就是树的遍历。方法就是遍历全部节点,ans为 当前树总和*其余节点总和 取最大值。
其实…就是考后序遍历。先序遍历会是O(n^2)的时间复杂度,后序遍历就是O(n)了。只不过好久没接触过树,不太会写… 其实好像不难,或者说…比较简单。唉。
/**
* 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:
const int MOD = 1e9+7;
long long sum = 0;
long long ans = 0;
long long getCount(TreeNode* rt) //后序遍历计算总和
{
if(!rt) return 0;
return rt->val + getCount(rt->left) + getCount(rt->right);
}
long long dfs(TreeNode* rt) //也是后序遍历计算总和
{
if(!rt) return 0;
long long tmp = rt->val + dfs(rt->left) + dfs(rt->right);
ans = max(tmp*(sum-tmp), ans);
return tmp;
}
int maxProduct(TreeNode* root) {
sum = getCount(root);
dfs(root);
return ans%MOD;
}
};