思路,递归,大问题分解成小问题
递归三件套:
- 递归结束条件是什么
- 大问题分解成小问题
- 每次递归给上次返回什么
package main
import "math"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func maxPathSum(root *TreeNode) int {
maxSum := math.MinInt32
var dfs func(root *TreeNode) int
dfs = func(root *TreeNode) int {
if root == nil {
return 0
}
left := dfs(root.Left)
right := dfs(root.Right)
//左+根+右 情况
all := left + root.Val + right
//更新到全局变量
maxSum = max(maxSum, all)
//max(左,右)+根 --->单边 情况
half := root.Val + max(left, right)
//主要是为了应为负数的情况,既然是负数,还不如不加
return max(half, 0)
}
dfs(root)
return maxSum
}
func max(a, b int) int {
if a > b {
return a
}
return b
}