最大路径和需同步处理节点向上贡献与本地拐点潜力;用全局变量max_sum记录极值,空节点返回0以支持max(0,gain)截断;dfs返回单侧最大路径和,同时用root->val+left+right更新全局最大值。

要让二叉树中任意路径(不重复节点、可跨左右子树)的节点值之和达到最大,必须同步处理每个节点的“向上贡献能力”和“本地拐点潜力”,不能只靠一次递归返回值推导最终答案,否则15→20→7这类跨子树路径会彻底丢失。
初始化全局极值与空节点处理
声明全局变量 【int max_sum = INT_MIN】,确保全负树(如[-3])也能捕获最大单节点值;所有递归入口第一行写 if (!root) return 0,防止空指针解引用崩溃。
空节点必须返回 0,不是 -1 或 INT_MIN——这是 max(0, gain) 截断逻辑生效的前提支点;若返回 INT_MIN,max(0, INT_MIN) 在多数平台虽仍为 0,但语义混乱且有溢出风险。
递归函数职责拆分与收益计算
定义辅助函数 int dfs(TreeNode* root),它只干一件事:返回以当前节点为起点向下延伸的最大单侧路径和(必须含自身,不可分叉)。
第一步:递归获取 left_gain = dfs(root->left) 和 right_gain = dfs(root->right)。
第二步:对左右收益分别截断:left = max(0, left_gain),right = max(0, right_gain)。这一步很关键——负子树不参与向上拼接,但原始 left_gain 和 right_gain 仍保留在栈中,供下一步完整路径计算使用。
第三步:用 root->val + left + right 更新全局最大值:max_sum = max(max_sum, root->val + left + right)。这个值代表以当前节点为顶点的“倒V型”路径和,是唯一能捕获跨左右子树路径的机会。
第四步:返回单侧最大收益:return root->val + max(left, right)。注意,这里用的是截断后的 left/right,保证向上返回非负或仅含自身值;若当前节点为 -5、左子返回 -10、右子为空,则 left=0、right=0,返回 -5,保留单点路径合法性。
三种合法路径情形的覆盖验证
方法一:以当前节点为顶点的完整路径,即 left + root->val + right。该情形已由上一步更新 max_sum 覆盖。
方法二:仅向左延伸路径,等价于 left_gain + root->val。该值隐含在 return 表达式中,且因 left 已被 max(0, left_gain) 处理,若 left_gain 为负,则实际取 root->val,自然涵盖单点路径。
方法三:仅向右延伸路径,等价于 right_gain + root->val。同理,由 return 表达式和 right 截断逻辑保障。
这三种情形互斥且完备,无需额外分支判断;漏掉任意一种都会导致 [-2,-1,-3] 返回 -6 而非正确答案 -1。
边界场景强制校验
单节点树:left_gain = right_gain = 0 → left = right = 0 → max_sum 更新为 root->val,返回值也为 root->val,完全覆盖。
全负树:每层 left 和 right 均为 0,max_sum 每次更新为当前 root->val,最终锁定最大负数;若初始化 max_sum = 0,则 [-3] 会错误返回 0。
叶节点:无子节点,dfs(root->left) 与 dfs(root->right) 均返回 0,路径和与收益均为自身值,逻辑自洽。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











