二叉树最大路径和需以节点收益为核心设计递归:一、单侧贡献回溯法用全局变量更新跨节点路径和;二、双返回值法用结构体分离子树最大路径与单侧贡献;三、惰性剪枝法显式处理负值,提升语义清晰度。

如果需要计算二叉树中任意路径上的节点值之和的最大值,该路径可从任意节点出发,经任意父-子连接到达任意节点,且每个节点最多访问一次,则需围绕“节点收益”这一核心概念设计递归逻辑。以下是实现该问题的几种关键递归策略:
一、基于单侧最大贡献值的递归回溯
每个节点向上返回的不是整条路径和,而是以该节点为端点、向下的单侧最大路径和(即左子树或右子树中较大者加上当前节点值),确保父节点能正确拼接左右分支;同时在每一层更新全局最大路径和,该路径可跨过当前节点连接左右子树。
1、定义全局变量 max_sum 初始化为 INT_MIN。
2、编写递归函数 maxGain(TreeNode* node),返回以 node 为起点向下延伸的最大单侧路径和(至少包含 node 自身)。
立即学习“C++免费学习笔记(深入)”;
3、若 node 为空,返回 0。
4、递归调用获取左子树最大单侧贡献 left_gain = max(maxGain(node->left), 0),右子树同理取 right_gain = max(maxGain(node->right), 0)。
5、计算以 node 为最高点的完整路径和:price_newpath = node->val + left_gain + right_gain,并用其更新 max_sum。
6、返回 node->val + max(left_gain, right_gain) 作为该节点对上层的单侧贡献。
二、分离路径和贡献的双返回值递归
避免使用全局变量,通过结构体或 pair 同时返回两个值:当前子树内最大路径和(可跨根)、当前节点向下可提供的最大单侧贡献(不可跨根),使状态传递更清晰且线程安全。
1、定义结构体 struct Result { int max_path; int max_single; };
2、空节点返回 {INT_MIN, 0},其中 max_path 表示子树内已知最大路径,max_single 表示可向上延伸的最大单侧值。
3、对非空节点,先递归获取左右子树结果 left_res 和 right_res。
4、计算跨过当前节点的路径值:cross = node->val + max(0, left_res.max_single) + max(0, right_res.max_single)。
5、当前子树最大路径和为:max({left_res.max_path, right_res.max_path, cross})。
6、当前节点单侧最大贡献为:node->val + max({0, left_res.max_single, right_res.max_single})。
三、统一负值处理的惰性剪枝递归
当所有节点值均为负数时,最优路径仅为最大单个节点值;该策略在递归中显式判断是否舍弃负向子路径,不依赖 max(0, x) 隐式截断,提升语义可读性。
1、递归函数返回类型为 int,表示以当前节点为端点的最大单侧路径和(允许仅含自身)。
2、对空节点返回 INT_MIN,并在上层显式判断是否忽略该分支。
3、获取左、右返回值 l 和 r,分别执行 l = (l == INT_MIN) ? 0 : max(0, l),r = (r == INT_MIN) ? 0 : max(0, r)。
4、更新全局最大值:max_sum = max(max_sum, node->val + l + r)。
5、返回 node->val + max(l, r)。


















