最大路径和为任意节点出发向下延伸路径上节点值之和的最大值;需递归计算各节点单侧最大收益并更新全局最大值,负收益子路径被截断为0以优化结果。

一、理解路径和收益的定义
在二叉树中,路径由任意节点出发,沿父-子连接向下延伸,且每个节点最多出现在路径中一次;路径和为路径上所有节点值之和。节点“收益”指以该节点为起点向下延伸所能贡献的最大单侧路径和(即必须包含该节点,且只能向左或右之一延伸)。计算最大路径和需同步维护全局最大值与每个节点向上的最大可传递收益。
1、定义递归函数返回值为从当前节点向下延伸的最大单侧路径和(含当前节点),即“收益”。
2、对空节点返回0,表示不提供正向收益。
3、对非空节点,分别计算左右子树递归调用所得收益。
4、当前节点的收益为:max(0, 左收益) + max(0, 右收益) + 当前节点值中的较大者与当前节点值之和,但仅取单侧:即当前节点值 + max(0, 左收益, 右收益)。
二、维护全局最大路径和
最大路径和不一定经过根节点,可能完全位于某子树内部,或横跨左右子树并经过当前节点。因此,在每次递归中,除计算当前节点收益外,还需用当前节点值加上左右子树的非负收益(若为负则舍弃),更新全局最大值。
1、初始化全局变量 max_sum = INT_MIN。
2、在递归函数内,计算current_path_sum = 当前节点值 + max(0, 左收益) + max(0, 右收益)。
3、执行 max_sum = max(max_sum, current_path_sum)。
4、递归返回值仍为当前节点值 + max(0, max(左收益, 右收益))。
三、处理负值节点的剪枝逻辑
当子树收益为负时,将其排除可提升整体路径和。因此,任何子节点的负收益均被截断为0,表示“不选择该子路径”,从而保证向上贡献的收益始终非负或仅保留当前节点自身值。
1、左子树收益 left_gain = max(0, dfs(left))。
2、右子树收益 right_gain = max(0, dfs(right))。
3、当前节点向上可传递的收益为 node->val + max(left_gain, right_gain)。
4、当前节点参与的完整路径和为 node->val + left_gain + right_gain。
四、递归终止与边界控制
递归终止条件为节点为空,此时返回0。该设计自然兼容叶节点:叶节点无子节点,左右收益均为0,其收益即为自身值,其完整路径和也为自身值。
1、若 root == nullptr,直接返回0。
2、避免对空指针解引用,所有子节点访问前均通过判空保障安全。
3、整数溢出风险通过使用 long long 临时存储中间和(可选),但标准实现中 int 足够覆盖题目约束范围。
五、核心递归函数结构实现
函数签名通常为 int dfs(TreeNode* node),内部完成收益计算、全局最大值更新与返回值构造。该函数不接受额外参数,依赖闭包或类成员变量维护全局最大值。
1、声明静态或成员变量 max_sum 并初始化为 INT_MIN。
2、在 dfs 函数开头处理空节点返回0。
3、递归调用左右子树获取收益。
4、按规则计算 current_path_sum 并更新 max_sum。
5、返回 node->val + max({0, left_gain, right_gain})。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











