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 }