二叉树最大路径和需区分路径与子树:递归函数返回以当前节点为起点的单向最大贡献值(负值截断为0),全局变量记录所有“左+根+右”路径的最大值。

在C++中求解二叉树最大路径和时,必须区分“路径”与“子树”的本质差异:路径可跨左右子树但不可重复经过节点,而递归过程中每个节点只能向上贡献一条单向链(即“节点收益”),这是避免路径重叠、保证正确性的核心前提。
理解路径定义与递归责任分离
最大路径和中的“路径”指任意两个节点之间唯一确定的节点序列,允许拐弯(如左→根→右),但不允许分叉或回溯;而递归函数本身不能直接返回完整路径,只能返回以当前节点为起点向下延伸的**单侧最大贡献值**(即“节点收益”)。
这是因为父节点调用左右子节点的递归结果时,只能选择其中一侧连上来——若同时接入左右,路径就在当前节点形成“V形”,无法再向上延伸,这属于全局候选路径,不是当前节点能提供的向上收益。
所以必须用一个全局变量记录所有“左+根+右”组合的最大值,而递归函数只负责计算并返回【max(0, 左收益) + 节点值】与【max(0, 右收益) + 节点值】中的较大者,且负收益必须截断为0(不拖累上级)。
定义递归函数签名与边界处理
声明 int maxGain(TreeNode* node),返回以 node 为起点向下延伸的最大单向路径和(含 node 自身,允许为空路径即0)。
遇到空节点立即返回 0,这是递归终止条件,也是收益截断的起点——空节点不提供任何正向价值,也不应引入负值干扰。
节点值可能为负数,因此每层递归必须显式比较:若左/右子树收益为负,就舍弃该侧(取0),否则才叠加。
递归体中更新全局最大路径和
第一步:递归获取 leftGain = maxGain(node->left),rightGain = maxGain(node->right)。
第二步:计算以当前节点为最高点的完整路径和:priceNewPath = node->val + max(0, leftGain) + max(0, rightGain)。
第三步:用 priceNewPath 更新全局变量 maxSum —— 这是所有“V形路径”的候选者,必须在此刻捕获。
第四步:返回当前节点能向上提供的最大单向收益:node->val + max(0, leftGain, rightGain)。注意这里只取左右中较大的一个,因为父节点只能接一条链上来。
这一步不能写成 node->val + leftGain + rightGain,否则路径将分裂为两条向上延伸的链,违反路径定义;也不能漏掉 max(0, ...) 导致负收益污染上级结果。
主函数初始化与调用
定义 int maxSum = INT_MIN 作为全局最大路径和容器,在调用 maxGain(root) 前完成初始化。
调用 maxGain(root),递归过程自动更新 maxSum。
返回 maxSum 即得答案。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











