0x00 题目
给你一棵二叉树,它的根为 root
请你删除 1
条边,使二叉树分裂成两棵子树
且它们子树和
的乘积
尽可能大
由于答案可能会很大
请你将结果对 10^9 + 7
取模后再返回
0x01 思路
因为要把树分成 2
部分
假设分割后第一棵树的和为 S
则剩下部分的和为整体的和 减去
S
所以需要先求出整棵树的和 T
因为不知道第一棵树以哪个节点为根合适
所以任何节点都需要遍历
到
使得 S * (T - S)
最大
同时记录最大
值
0x02 解法
语言:Swift
树节点:TreeNode
public class TreeNode {
public var val: Int
public var left: TreeNode?
public var right: TreeNode?
public init() { self.val = 0; self.left = nil; self.right = nil; }
public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
self.val = val
self.left = left
self.right = right
}
}
解法:
func maxProduct(_ root: TreeNode?) -> Int {
// 结果
var res: Int = Int.min
// 总和
var allSum: Int = 0
// 第一部分子树和
var nodeSum: Int = 0
// 求总和
func sum(_ root: TreeNode?) -> Int {
guard let r = root else { return 0 }
return r.val + sum(r.left) + sum(r.right)
}
// 递归求子树和
func dfs(_ root: TreeNode?) -> Int {
guard let r = root else { return 0 }
// 子树和
nodeSum = r.val + dfs(r.left) + dfs(r.right)
// 计算最大值
res = max(res, (allSum - nodeSum) * nodeSum)
return nodeSum
}
allSum = sum(root)
_ = dfs(root)
res = res % (Int(1e9) + 7)
return res
}
0x03 我的小作品
欢迎体验我的作品之一:小笔记-XNote
笔记好帮手~
一步到位
App Store
搜索即可~