Description

Given a binary tree root. Split the binary tree into two subtrees by removing 1 edge such that the product of the sums of the subtrees are maximized.

Since the answer may be too large, return it modulo 10^9 + 7.

Example 1:

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:

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)

Example 3:

Input: root = [2,3,9,10,7,8,6,5,4,11,1]
Output: 1025

Example 4:

Input: root = [1,1]
Output: 1

Constraints:

  • Each tree has at most 50000 nodes and at least 2 nodes.
  • Each node’s value is between [1, 10000].

分析

题目的意思是:给定一颗二叉树,然后删除一条边,求分别求和,使得乘积最大。这道题如果先遍历把二叉树的总和求出来就好办了,如果能想到这个,后面就递归的时候更新最大乘积就行了。

res=max(res,t*(x-t))

其中x为所有结点的总和,t未当前子树的和。关键是要想到把二叉树的总和求出来,然后剩下的事情就好办了。

代码

# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def getSum(self,root):
if(root is None):
return 0
return self.getSum(root.left)+self.getSum(root.right)+root.val
def solve(self,root,x):
if(root is None):
return 0
l=self.solve(root.left,x)
r=self.solve(root.right,x)
t=l+r+root.val
self.res=max(self.res,t*(x-t))
return t
def maxProduct(self, root: TreeNode) -> int:
self.res=0
x=self.getSum(root)
self.solve(root,x)
return self.res%(10**9+7)

参考文献

​[LeetCode] solution​