This commit is contained in:
2026-06-26 01:27:21 +10:00
parent 416b0e9954
commit e2f0b5c11a
2 changed files with 173 additions and 0 deletions
+69
View File
@@ -0,0 +1,69 @@
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
}