描述
该题来自于力扣第124题
分析
对于树的问题,一般是划分为左子树和右子树求解。而对于该问题首先考虑经过根结点的路径有几种情况:
1. 从左子树开始以根节点为结束的路径
2. 从右子树开始以根节点为结束的路径
3. 经过根节点的路径(即跟结点在路径中间)
上面三种情况取路径和最大值,就是经过根结点的路径和的最大值;然后对每个节点都计算,最后取全局最大值就是结果。
那么化为子问题的时候,当前节点记为root
,以左子结点root.left
为根结点的话,求出以该节点为结束的路径和大最大值left_max
,同理以右子节点root.right
为根结点可以求出right_max
;那么以root
为根结点的第一种情况下的路径和就是max(left_max, 0)+root.val
,第二种情况下的路径和就是max(right_max, 0)+root.val
,第三种情况下路径和为max(left_max, 0)+max(right_max, 0) + root.val
,最后这三种取最大。
所以最终的解决思路是定义一个函数f,输入为结点root
,输出为以该结点结尾的路径的路径和最大值。从而递归如下:
1.
首先获取以左子节点为结尾的路径的路径和最大值left_max=max(f(root.left), 0)
2. 同理右子节点有right_max=max(f(root.right), 0)
3.
那么以root
结尾的路径的路径和最大值就是curr_max = root.val + max(left_max, right_max)
4.
同时计算出三种情况的最大值left_max + right_max + root.val
,将该值与全局最大值ans
比较,取max
即可。
5.
函数返回以root
结尾的路径的路径和最大值curr_max
代码
1 | class Solution: |