1.题目描述
给定一个二叉树的根节点
root
,返回其 最大路径和,即所有路径上节点值之和的最大值。比如root=[-10,9,20,null,null,15,7],最优15+20+7,得到42
2.解题思路
给定二叉树,首先想到递归
需要定义结点贡献值,表示子节点和父节点的关系
递归求出各个结点贡献值
递归过程中更新maxSum
3.代码解读
3.1 树结点
定义树结点val+left+right
# 定义二叉树结点
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
3.2 变量maxSum
记录存储最大和的变量
def Solution:
#用于存储最大和的变量
def __init__(self):
self.maxNum=0
3.3 递归函数
算法主体定义一个递归函数,算法只需从maxGain(root)开始即可
def Solution:
def __init__(self):
#存储结果的变量
self.maxSum=0
def maxSum(self,root):
#定义递归
def maxGain(node):
#空结点or非空结点
if not node:
return 0
#左右最终贡献
leftGain=max(maxGain(node.left),0)
rightGain=max(maxGain(node.right),0)
#当前结点val+左右子节点Gain
currentSum=self.val+leftGain+rightGain
#更新
self.maxSum=max(self.maxSum,currentSum)
#val值+子节点贡献值的
return self.val+max(leftGain,rightGain)
#递归入口
maxGain(root)
#返回
return self.maxSum
3.3.1递归方式
每个node进行maxSum时,对left和right进行递归调用
3.3.2 贡献值的定义
贡献值是对父结点“贡献”(要求路径的数值和),node的贡献值=self.val+子节点贡献值较大值
如果计算值为负,父节点在使用时最终取0(避免使用该子结点)
3.3.3 更新方式
currentSum=当前节点val+左右贡献值
比较currentSum与self.maxSum的大小,
如果currentSum较大,将self.maxSum赋值为currentSum的值