二叉树最大路径和问题中,以每个节点为最高点计算三种合法路径和(左右子+当前、左子+当前、右子+当前),取最大值更新全局结果;空节点收益为0,负收益子树在上传时舍弃但参与顶点路径计算。

一、理解路径与收益的定义
在二叉树中,路径由任意节点出发,沿父-子连接向下延伸,可经过任意数量节点,但不可重复访问同一节点;路径和为所经节点值之和。每个节点的“收益”指以该节点为起点、向下的单侧最大路径和(含自身),用于向上贡献,不包含折返路径。核心目标是:对每个节点,计算其作为路径最高点时能形成的全局最大路径和,并同步更新其向上传递的单侧最大收益。
二、递归状态设计与返回值含义
递归函数需同时支持两个目标:向上返回本节点所能提供的最大单侧收益(供父节点拼接),并在递归过程中持续更新全局最大路径和。因此,函数返回值定义为以当前节点为起点向下延伸的最大单侧路径和(必须包含当前节点),而全局最大值通过引用或类成员变量在遍历中持续比较更新。
三、路径组合的三种合法情形
当处理某一节点时,以其为路径最高点,可构成的完整路径仅包括以下三种互斥情形:左子树单侧最大收益 + 当前节点值 + 右子树单侧最大收益;左子树单侧最大收益 + 当前节点值;右子树单侧最大收益 + 当前节点值。其中第一种对应跨越左右子树的“倒V型”路径,后两种对应仅向一侧延伸的路径。这三种情形中取最大值,即为以该节点为顶点的路径最大和候选值。
四、空节点与负收益的处理逻辑
空节点不贡献任何值,其收益视为0;若某子树返回的单侧收益为负,则不应纳入当前路径,因其会拉低总和——因此在计算向上传递的收益时,需对左右子收益分别取max(0, 子收益)后再加当前节点值;但在计算以当前节点为顶点的完整路径和时,仍需将左右子原始收益(含负值)参与组合,再与0比较取大,确保不遗漏仅含当前节点的单点路径。
立即学习“C++免费学习笔记(深入)”;
五、递归调用与全局最大值更新步骤
1、若当前节点为空,返回0。
2、递归调用左子节点,获取其最大单侧收益left_gain。
3、递归调用右子节点,获取其最大单侧收益right_gain。
4、计算以当前节点为顶点的路径最大和:current_path_sum = node->val + max(0, left_gain) + max(0, right_gain)。
5、更新全局最大路径和:global_max = max(global_max, current_path_sum)。
6、计算并返回当前节点向上传递的最大单侧收益:node->val + max(0, max(left_gain, right_gain))。


















