1339.Maximum Product of Splitted Binary Tree === ###### tags: `Medium`,`Tree`,`Binary Tree`,`DFS` [1339. Maximum Product of Splitted Binary Tree](https://leetcode.com/problems/maximum-product-of-splitted-binary-tree/) ### 題目描述 Given the `root` of a binary tree, split the binary tree into two subtrees by removing one edge such that the product of the sums of the subtrees is maximized. Return the *maximum product of the sums of the two subtrees*. Since the answer may be too large, return it **modulo** 10^9^ + 7. **Note** that you need to maximize the answer before taking the mod and not after taking it. ### 範例 **Example 1:** ![](https://assets.leetcode.com/uploads/2020/01/21/sample_1_1699.png) ``` Input: root = [1,2,3,4,5,6] Output: 110 Explanation: Remove the red edge and get 2 binary trees with sum 11 and 10. Their product is 110 (11*10) ``` **Example 2:** ![](https://assets.leetcode.com/uploads/2020/01/21/sample_2_1699.png) ``` Input: root = [1,null,2,3,4,null,null,5,6] Output: 90 Explanation: Remove the red edge and get 2 binary trees with sum 15 and 6.Their product is 90 (15*6) ``` **Constraints**: * The number of nodes in the tree is in the range [2, 5 * 10^4^]. * 1 <= `Node.val` <= 10^4^ ### 解答 #### C++ ```cpp= class Solution { public: long long result, total; long long dfs(TreeNode* root) { if (!root) return 0; if (root->left == root->right) return root->val; long long l_sum = dfs(root->left); long long r_sum = dfs(root->right); result = max(result, (total - l_sum) * l_sum); result = max(result, (total - r_sum) * r_sum); return root->val + l_sum + r_sum; } int maxProduct(TreeNode* root) { total = dfs(root); dfs(root); return result % 1000000007; } }; ``` > [name=Yen-Chi Chen][time=Sat, Dec 10, 2022] #### Python ```python= class Solution: def maxProduct(self, root: Optional[TreeNode]) -> int: all_sums = [] def get_tree_sum(root): if not root: return 0 left_sum = get_tree_sum(root.left) right_sum = get_tree_sum(root.right) total_sum = root.val + left_sum + right_sum all_sums.append(total_sum) return total_sum best = 0 total = get_tree_sum(root) for s in all_sums: best = max(best, (total - s) * s) return best % (10 ** 9 + 7) ``` > [name=Kobe][time=Sun, Dec 11, 2022] ### Reference [回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)