Leetcode 124 二叉树中的最大路径和 Golang题解

首先,对于每一颗子树来说,考虑的问题是相同的,因为每一颗子树都会生成一个最大路径和,并且父亲的最大路径和是由其子树决定了,因此,问题的性质为,不同规模下的相同问题,这种情况,比较适合用递归去处理。

对于每一颗子树最大路径和的递归问题,我们首先要考虑,将其分为全局最优和局部最优。

全局最优指的是,在考虑整个问题的最大路径和时,这颗子树是否能最大化收益,那么很显然,对于这颗子树的全局最优为val(left)+val(root)+val(right)

 而局部最优则考虑的是,当我们考虑这颗子树的父节点的时候,这颗子树能为他父结点带来的收益。那么此时,由于我们要从父节点出发考虑问题,这颗子树递归返回父节点的值,只能是其本身的值,和其一个孩子上的值。既val(root)+max(val(left),val(right))

特殊值判断:注意,局部最优有可能小于0,比如当前节点为负数,那么就应该判断不走入该子树,所以需要把局部最优和0对比,全局最优需要设成负无穷,因为要考虑节点全为负的情况,这种情况下,全局最优可能会小于0

综上所述,代码如下

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func maxPathSum(root *TreeNode) int {
    Maxn := math.MinInt32//全局最优
    ChildMaxn := 0 //局部最优

    var dfs func(root *TreeNode) int
    dfs = func(root *TreeNode) int{
        if root == nil{//边界条件
            return 0
        }
        //求两个孩子局部最优
        left := dfs(root.Left)
        right := dfs(root.Right)
        //更新全局最优
        Maxn = max(Maxn, left + right + root.Val)

        //返回局部最优
        ChildMaxn = root.Val + max(left,right)

        return max(ChildMaxn,0)//注意局部最优可能为负
    }

    dfs(root)
    return Maxn

}

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值