u
This commit is contained in:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user