maxPathSum不能直接返回子树最大路径和,因为路径可拐弯(如左→根→右),而递归只能向上返回一条单向路径;需区分全局最优解(允许拐弯)与当前节点能贡献的最大单向路径和(不允许拐弯)。

为什么maxPathSum不能直接返回子树最大路径和?
因为路径在二叉树中可以“拐弯”——从左子树经根到右子树,但递归函数每次只能向上交出一条连续链(即从当前节点向下延伸的单向路径)。所以maxPathSum必须区分两个值:全局最优解(允许拐弯)和当前节点能向上贡献的最大单向路径和(不允许拐弯,否则父节点无法拼接)。常见错误是只维护一个返回值,导致漏掉left + root->val + right这种跨左右的路径。
getMaxSinglePath函数里要不要强制取正?
要,但不是加max(0, ...)就完事。关键在于:如果某条单向路径和为负,向上贡献不如不贡献(即用0代替),因为父节点加上负值只会拉低总和。但注意——这个截断只发生在“向上返回”时,不影响当前节点参与的拐弯路径计算(比如左右都负,但根本身为正,那最大路径就是root->val)。
实操建议:
- 在
getMaxSinglePath中,对左右子树结果分别做max(0, left_gain)和max(0, right_gain) - 当前节点的拐弯路径候选值为
root->val + left_gain + right_gain(这里left_gain/right_gain是原始递归返回值,未截断) - 向上返回的是
root->val + max(left_gain, right_gain),且该值也要和0取大
空节点返回0还是INT_MIN?
返回0。因为路径至少包含一个节点,空节点本就不参与路径;若返回INT_MIN,会导致root->val + INT_MIN溢出或逻辑混乱。更本质的原因是:我们定义getMaxSinglePath的语义是“以当前节点为起点、向下延伸的最大路径和”,空节点无起点,自然贡献0。
容易踩的坑:
- 误把空节点当“无效路径”而返回极小值,结果在
max(0, ...)前就溢出了 - 忘记初始化全局答案变量(如
max_sum),用局部变量替代,导致始终返回默认值 - 在叶子节点处没考虑单独一个节点的情况,漏掉
root->val本身作为路径
LeetCode 124题AC代码里最关键的三行是什么?
不是整个递归结构,而是这三行决定是否捕获所有路径形态:
int left_gain = max(0, getMaxSinglePath(root->left)); int right_gain = max(0, getMaxSinglePath(root->right)); max_sum = max(max_sum, root->val + left_gain + right_gain);
第一、二行确保单向路径收益不拖累父节点;第三行把“经过当前节点的U型路径”纳入全局比较——它不依赖于向上返回值,是独立更新的。漏掉其中任意一行,都会导致某些测试用例失败(比如全负数数组、只有根节点、右子树为负但左子树极大等场景)。
真正复杂的地方在于:同一轮递归里既要算“能上传的值”,又要算“可能成为最终答案的值”,二者不可互换。很多人试图合并逻辑,结果把max_sum更新写在return前却用了截断后的left_gain,就丢掉了负子树下仅靠根节点取胜的情况。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











