LeetCode 124题(二叉树中的最大路径和)

LeetCode 124题(二叉树中的最大路径和)

题目描述:
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和
在这里插入图片描述
思路:对路径定义的理解很重要,按照上图所示,-10,20,15,7就不是一条路经,因为无法走通,但是这却是递归遍历中的一种常见的遍历形式,很容易干扰思路。直接想到的方法就是后序遍历,先遍历左子树,再遍历右子树,最后再将root考虑进来,这也是二叉树算法题目的核心思想,同时,这是一个搜索最优子和的问题,一般需要一个变量"result"记录搜索过程中出现过的最优值并更新,每次搜索将result与left+right+root->val比较进行更新,最后一个要考虑的是递归函数的返回结果的形式,一开始想当然的把left,right和root->val加起来最为返回值,这样再继续往上回溯时就会形成上面所述的类似-10,20,15,7这样的不是通路的结果,很显然left和right必须隔离开来,应该将取left和right的最大值与root数值相加并返回。

从另一个角度来思考,之前算法课老师讲动态规划问题的时候,每一个递归问题分解必须给出子问题的确切定义,这里的left和right(见代码)也需要给出分别代表的含义,left可表示为从下往上遍历以左子节点为终点的最大路径和,right表示从下往上遍历以右子节点为终点的最大路径和,两条路径中的最大值再和root->val相加得到以root为终点的最大路径和.

class Solution(object):
    result = -10001
    def maxPathSum(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        return max(self.maxHelper(root),self.result)

    def maxHelper(self,root):
        if root == None:
            return 0
        left = max(0,self.maxHelper(root.left))
        right = max(0,self.maxHelper(root.right))
        self.result = max(self.result,left+right+root.val)
        return max(left,right) + root.val
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值