二叉树最大路径和是任意不重复节点路径的节点值之和最大值,需后序遍历:每个节点计算以它为顶点的完整路径(左+根+右)更新全局最大值,并返回以它为端点的单向最大链(根+max(0,左,右)),负子路径必须截断。

什么是二叉树路径最大和?
它不是求某条从根到叶子的路径上节点值之和的最大值,而是求「任意一条路径」(节点数 ≥ 1,路径可跨左右子树,但不能重复经过同一节点)所能达到的最大节点值总和。关键点在于:路径可以以任意节点为起点和终点,只要连续、不回溯即可——这决定了不能简单 DFS 每条根到叶路径。
maxPathSum 函数怎么写?
核心思路是后序遍历 + 分治:对每个节点,计算两个值:
① 以该节点为**最高点**(即路径拐弯处)能构成的最大路径和(左链 + 当前节点 + 右链);
② 以该节点为**端点**向上延伸的最大单向路径和(用于父节点拼接,只能选左或右中较大者 + 当前节点)。
用一个全局变量或引用参数持续更新全局最大值,返回值只负责传递单向最大和:
int maxPathSum(TreeNode* root) {
int res = INT_MIN;
dfs(root, res);
return res;
}
<p>int dfs(TreeNode* node, int& res) {
if (!node) return 0;
int left = max(0, dfs(node->left, res)); // 负贡献子路径直接舍弃
int right = max(0, dfs(node->right, res));
res = max(res, node->val + left + right); // 当前节点作顶点的完整路径
return node->val + max(left, right); // 向上返回单向最大链
}</p>
注意:left 和 right 与 0 取 max 是关键——负值子路径只会拉低总和,必须截断。
为什么不能用 BFS 或中序遍历?
因为路径结构依赖父子关系与左右分支的组合,BFS 按层访问无法自然获取子树内部最大单向链;中序遍历顺序打乱了父子连通性,无法在访问当前节点时拿到左右子树的最优单向结果。只有后序能保证:处理当前节点时,左右子树的 dfs 返回值已是最优单向和。
常见错误包括:
- 忘记对左右子路径和取
max(0, ...),导致负值拖累全局最大值 - 把返回值也加上左右之和(即写成
node->val + left + right),造成路径重复分叉,违反“单向向上”语义 - 初始化
res为 0 而非INT_MIN,当所有节点为负时会错误返回 0
边界情况和性能注意点
空树、单节点、全负数节点都要能正确处理。时间复杂度是 O(n)(每个节点访问一次),空间复杂度 O(h)(递归栈深度,h 为树高)。如果树极度不平衡(链状),递归可能爆栈,此时需手动模拟栈或改用 Morris 遍历——但实际工程中更常加栈大小限制或改用迭代式后序(需额外标记状态),而非硬刚最坏情况。
真正容易被忽略的是:路径不要求经过根,也不要求是根到叶——所以哪怕最深的叶子节点值很小,只要中间某个三叉路口(当前节点+左右正向链)的和更大,它就是答案。别被“路径”二字误导去枚举起点终点。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











