70 lines
1.4 KiB
Go
70 lines
1.4 KiB
Go
package top100liked
|
|
|
|
// https://leetcode.cn/problems/binary-tree-maximum-path-sum/description/?envType=study-plan-v2&envId=top-100-liked
|
|
|
|
type TreeNode struct {
|
|
Val int
|
|
Left *TreeNode
|
|
Right *TreeNode
|
|
}
|
|
|
|
func buildTree(arr []*int) *TreeNode {
|
|
if len(arr) == 0 || arr[0] == nil {
|
|
return nil
|
|
}
|
|
|
|
root := &TreeNode{Val: *arr[0]}
|
|
queue := []*TreeNode{root}
|
|
i := 1
|
|
|
|
for len(queue) > 0 && i < len(arr) {
|
|
node := queue[0]
|
|
queue = queue[1:]
|
|
|
|
// 处理左孩子
|
|
if i < len(arr) {
|
|
if arr[i] != nil {
|
|
node.Left = &TreeNode{Val: *arr[i]}
|
|
queue = append(queue, node.Left)
|
|
}
|
|
i++
|
|
}
|
|
|
|
// 处理右孩子
|
|
if i < len(arr) {
|
|
if arr[i] != nil {
|
|
node.Right = &TreeNode{Val: *arr[i]}
|
|
queue = append(queue, node.Right)
|
|
}
|
|
i++
|
|
}
|
|
}
|
|
|
|
return root
|
|
}
|
|
|
|
func maxPathSum(root *TreeNode) int {
|
|
ans := root.Val // TODO: 先随便给个初值, 后面会被更新
|
|
|
|
// dfs 返回"从 node 往下单边的最大贡献"
|
|
var dfs func(node *TreeNode) int
|
|
dfs = func(node *TreeNode) int {
|
|
if node == nil {
|
|
return 0
|
|
}
|
|
|
|
left := max(0, dfs(node.Left)) // 负的就别带
|
|
right := max(0, dfs(node.Right)) // 负的就别带
|
|
|
|
// TODO 1: 在这里转弯的完整路径和, 更新 ans
|
|
if left+right+node.Val > ans {
|
|
ans = left + right + node.Val
|
|
}
|
|
// TODO 2: 返回往父节点贡献的单边值
|
|
return max(left, right) + node.Val
|
|
}
|
|
|
|
dfs(root)
|
|
return ans
|
|
}
|