二叉树中的最大路径和
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。h = 0 s = -inf # 因为题目要求至少包含一个节点,如果设为 0,那么当所有节点为负数时,就会出错
Last updated
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。h = 0
s = -inf # 因为题目要求至少包含一个节点,如果设为 0,那么当所有节点为负数时,就会出错Last updated
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def maxPathSum(self, root: Optional[TreeNode]) -> int:
from dataclasses import dataclass
@dataclass
class Info:
h: int # 该节点能提供的最大路径(含节点本身)
s: int # 该节点下的最大路径(可能不包含该节点)
# 事实上 Info 里的 s 完全可以用一个全局变量来代替,这里是为了尽量拟合模板;熟练之后就不必这么做了。
def dfs(x):
if not x:
# 对空节点,初始化 h=0, s=负无穷
return Info(0, float('-inf'))
l, r = dfs(x.left), dfs(x.right)
x_h = x.val + max(0, l.h, r.h)
x_s = max(l.s, r.s, max(l.h, 0) + max(r.h, 0) + x.val)
return Info(x_h, x_s)
return dfs(root).s