广告建设网站建设,丹阳建站推广管理,石家庄网站建设远策科技,wordpress文章点赞插件1. 题目
给你一棵二叉树#xff0c;它的根为 root 。请你删除 1 条边#xff0c;使二叉树分裂成两棵子树#xff0c;且它们子树和的乘积尽可能大。
由于答案可能会很大#xff0c;请你将结果对 10^9 7 取模后再返回。
示例 1#xff1a;
输入#xff1a;root [1,2…1. 题目
给你一棵二叉树它的根为 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] 之间。来源力扣LeetCode 链接https://leetcode-cn.com/problems/maximum-product-of-splitted-binary-tree 著作权归领扣网络所有。商业转载请联系官方授权非商业转载请注明出处。 2. DP解题
class Solution {
public:int maxProduct(TreeNode* root) {int sum subsum(root);//求每个节点的包含自己在内及子节点和unsigned long long maxProduct 1;dfs(root,sum,maxProduct);//遍历树对每个节点求 val*sum-val,取最大return int(maxProduct%1000000007);}int subsum(TreeNode* root){if(!root) return 0;int l subsum(root-left);//自底向上DPint r subsum(root-right);root-val lr;return root-val;}void dfs(TreeNode* root, int sum, unsigned long long maxProduct){if(!root || (!root-left !root-right)) return;unsigned long long product;if(root-left){product (unsigned long long)root-left-val * (sum-root-left-val);if(product maxProduct)maxProduct product;}if(root-right){product (unsigned long long)root-right-val * (sum-root-right-val);if(product maxProduct)maxProduct product;}dfs(root-left,sum,maxProduct);dfs(root-right,sum,maxProduct);}
};