45 lines
776 B
Go
45 lines
776 B
Go
package q1339
|
|
|
|
type TreeNode struct {
|
|
Val int
|
|
Left *TreeNode
|
|
Right *TreeNode
|
|
}
|
|
|
|
func sumSumTrees(node *TreeNode) int {
|
|
if node == nil {
|
|
return 0
|
|
}
|
|
node.Val += sumSumTrees(node.Left) + sumSumTrees(node.Right)
|
|
return node.Val
|
|
}
|
|
|
|
func findNearest(node *TreeNode, target int) int {
|
|
if node == nil {
|
|
return -1
|
|
}
|
|
ret := node.Val
|
|
l, r := findNearest(node.Left, target), findNearest(node.Right, target)
|
|
if abs(l-target) < abs(ret-target) {
|
|
ret = l
|
|
}
|
|
if abs(r-target) < abs(ret-target) {
|
|
ret = r
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func abs(n int) int {
|
|
if n < 0 {
|
|
return -n
|
|
}
|
|
return n
|
|
}
|
|
|
|
func maxProduct(root *TreeNode) int {
|
|
totalSum := sumSumTrees(root)
|
|
nearest := findNearest(root, totalSum/2)
|
|
return nearest * (totalSum - nearest) % (1e9 + 7)
|
|
}
|
|
|
|
var _ = maxProduct
|