描述
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例2:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
思路
注意
1. 递归的时候 子树放回的值 不一定是子树的最大路径和 需要指定一个变量 将子树的最大路径和保存下来
2. 递归返回的时候 必须要是左/右 子树 加上根节点 或者只有根节点 不然这个子树返回时路径就断了
实现
var IntMax = int(^uint(0) >> 1)
func maxPathSum(root *TreeNode) int {
if root == nil{
return 0
}
var max = ^IntMax
maxPathSumHelp(root, &max)
return max
}
func maxPathSumHelp(root *TreeNode, max *int)int{
var left int
var right int
var rootMax int
if root.Left != nil{
left = maxPathSumHelp(root.Left, max)
}
if root.Right != nil{
right = maxPathSumHelp(root.Right, max)
}
if left > 0{
rootMax = rootMax + left
}
if right > 0{
rootMax = rootMax + right
}
rootMax = rootMax + root.Val
*max = Max(*max, rootMax)
if Max(left, right) > 0{
return Max(left, right) + root.Val
}else{
return root.Val
}
}
func Max(a, b int) int {
if a >= b {
return a
} else {
return b
}
}
func MaxPathSum(root *TreeNode) int {
var intMax = int(^uint(0) >> 1)
var intMin = ^intMax
var max = intMin
DoMaxPathSum(root, &max)
return max
}
func DoMaxPathSum(root *TreeNode, max *int) int{
var maxL int
var maxR int
var maxRoot int
if root == nil{
return 0
}
maxL = Max(DoMaxPathSum(root.Left, max), 0)
maxR = Max(DoMaxPathSum(root.Right, max), 0)
maxRoot = maxL + maxR + root.Val
*max = Max(*max, maxRoot)
return root.Val + Max(maxL, maxR)
}