leetcode ho100 124. 二叉树中的最大路径和 hard


python 复制代码
	   a (root)
  	 /    \
    b      c

对于一个节点node,有3种情况:

  1. node是最大路径的转折点(U型路径):b+a+c
  2. node是最大路径的传递者(单边向上):路径为 a+ba + ba+b 或 a+ca + ca+c。把这一段送给父节点,父节点可以继续往上连。:b+a+a的父节点
  3. node是最大路径的独立点(or null 节点):如果左右子树全是负数,你可能只选你自己 aaa,并把它送给父节点。
  4. node是最大路径的旁观者:最大路径完全在你的左子树或右子树内部产生,根本不经过node。

"能向上汇报的贡献值"和"当前形成的完整路径和"。

  • 计算:当前形成的完整路径和(递归),更新最大值变量
  • 返回:能向上汇报的贡献值
python 复制代码
# 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:  # 返回root的最大路径

        # 全局变量记录遍历过程中产生的最大值。
        self.max_sum = float('-inf')   # 子函数需要调的父函数的变量self.

        def dfs(node):
            if not node:  # 没有节点,和为 0
                return 0

            # 1. 向下递归:子树贡献是负数,不选
            left_gain = max(dfs(node.left), 0)  #  左子节点的最大路径
            right_gain = max(dfs(node.right), 0)  #  左子节点的最大路径

            # 2.  "拐弯"的路径: 左边贡献 + 当前节点 + 右边贡献 
            # 如果左右子树贡献为0,自然就是"单边"or"就node自己"
            current_path_sum = node.val + left_gain + right_gain

            # 更新全局最大值
            self.max_sum = max(self.max_sum, current_path_sum)

            # 3. 向上回溯:返回给父节点
            # node作为父节点的子节点,(node向下只能单边)
            return node.val + max(left_gain, right_gain)

        dfs(root)  # 在dfs中更新全局变量
        return self.max_sum

        

时间复杂度:O(n),其中 n 为二叉树的节点个数。

空间复杂度:O(n)。最坏情况下,二叉树退化成一条链,递归需要 O(n) 的栈空间。

相关推荐
py有趣6 小时前
力扣热门100题之不同路径
算法·leetcode
_日拱一卒6 小时前
LeetCode:25K个一组翻转链表
算法·leetcode·链表
小欣加油6 小时前
leetcode2078 两栋颜色不同且距离最远的房子
数据结构·c++·算法·leetcode·职场和发展
我真不是小鱼6 小时前
cpp刷题打卡记录30——轮转数组 & 螺旋矩阵 & 搜索二维矩阵II
数据结构·c++·算法·leetcode
帅小伙―苏8 小时前
力扣42接雨水
前端·算法·leetcode
6Hzlia8 小时前
【Hot 100 刷题计划】 LeetCode 287. 寻找重复数 | C++ 数组判环 (快慢指针终极解法)
c++·算法·leetcode
穿条秋裤到处跑14 小时前
每日一道leetcode(2026.04.19):下标对中的最大距离
算法·leetcode·职场和发展
木子墨51614 小时前
LeetCode 热题 100 精讲 | 计算几何篇:点积叉积 · 线段相交 · 凸包 · 多边形面积
c++·算法·leetcode·职场和发展·动态规划
py有趣15 小时前
力扣热门100题之最小路径和
算法·leetcode
im_AMBER15 小时前
Leetcode 159 无重复字符的最长子串 | 长度最小的子数组
javascript·数据结构·学习·算法·leetcode