0
点赞
收藏
分享

微信扫一扫

【二叉树】分裂二叉树的最大乘积


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​​ 搜索即可~


举报

相关推荐

0 条评论