标签:https 分析 treenode lan local pre block str 节点
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
输入: [1,2,3]
1
/ \
2 3输出: 6
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7输出: 42
? 本题中的路径指的并不是由根结点出发到叶子结点,树中任意的两个结点之间的路就称为路径。因此我们可以得到一个很清晰的递归结构:每个结点都有一个对自己的子树中的贡献值,而对于每个结点,最大路径和公式为:根结点值 + 左右子树的贡献值。
? 贡献值公式中必须有当前根结点值,因为只有这样才可以进行递归计算。同时我们设置一个全局变量max_sum来统计最大路径和。
class Solution:
def maxPathSum(self, root: TreeNode) -> int:
def max_gain(node: TreeNode) -> int:
nonlocal max_sum
if not node:
return 0
left_gain = max(max_gain(node.left), 0)
right_gain = max(max_gain(node.right), 0)
# 更新
price_newpath = node.val + left_gain + right_gain
max_sum = max(max_sum, price_newpath)
# 递归
return node.val + max(left_gain, right_gain)
max_sum = float(‘-inf‘)
max_gain(root)
return max_sum
? 做二叉树的题目时,必须要确保递归性,如果本题中我们在获取贡献值中加入 对本结点正负值的判断,这样就可以保证该结点存储了该子树的最大路径和。但是却让结构无法递归。因此我们选择用一个全局变量来保存最大路径和,而每个结点返回自己的“贡献值”。
【LeetCode每日一题】2020.6.21 124. 二叉树中的最大路径和
标签:https 分析 treenode lan local pre block str 节点
原文地址:https://www.cnblogs.com/enmac/p/13174094.html